Chinaunix首页 | 论坛 | 博客
  • 博客访问: 546472
  • 博文数量: 17
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 2325
  • 用 户 组: 普通用户
  • 注册时间: 2004-10-26 16:15
文章分类

全部博文(17)

文章存档

2008年(17)

我的朋友

分类: C/C++

2008-07-17 18:41:10

代码如下
 

template <class T>
class TypeMessage {
private:
    static vector<class Handler*> registry;
public:
    class Handler {
    public:
        Handler() { TypeMessage<T>::registerHandler( this ); }
        virtual void handleEvent(const T* t) = 0;
    };
    void notify() {
        for(int i = 0; i < registry.size(); i++)
            registry.at(i)->handleEvent( (T*)this );
    }
    static void registerHandler(Handler* h) { registry.push_back( h ); }
};

class On : public TypeMessage<On> {
    string comment;
public:
    On(string str) { comment = str; }
    void start() const { cout << "OnEvent.start - " << comment << '\n'; }
};
//template<>

vector<TypeMessage<On>::Handler*> TypeMessage<On>::registry;

class Off : public TypeMessage<Off> {
    string comment;
public:
    Off( string str ) { comment = str; }
    void stop() const { cout << "OffEvent.stop - " << comment << '\n'; }
};
//template<>

vector<TypeMessage<Off>::Handler*> TypeMessage<Off>::registry;

 

定义的两个registry在VC8下编译提示error C2371: 'registry' : redefinition; different basic types 。在g++下编译通过。

经smth上的牛人指点,寻得解决方法,把Class TypeMessage中的private:    static vector<class Handler*> registry;放到class Handler的定义之后。名字查找过程中,规则不同。这里的Handler对于VC8编译器来说,和下面的TypeMessage::Handler没有关系,和叫HandlerB一个效果。
而在g++里,把这两者等同了。




 

阅读(1683) | 评论(0) | 转发(0) |
0

上一篇:Liba的DB错误

下一篇:smarty的脾气

给主人留下些什么吧!~~