使用模板在C ++中实现通用消息传递

时间:2014-09-08 09:30:59

标签: c++ templates generics messaging

我试图实现通用消息传递以在C ++中的类之间发送泛型类型的消息,但是我仍然坚持使用通用侦听器和虚函数调用来处理各种类型的消息。编译器无法找到虚拟句柄消息函数的符号并给出错误:

Undefined symbols for architecture x86_64:
  "messaging::IMessageListener<int>::handleMessage(int const&)", referenced from:
      vtable for messaging::IMessageListener<int> in main.o
ld: symbol(s) not found for architecture x86_64

这是我到目前为止所做的:

#ifndef MESSAGING_HPP
#define MESSAGING_HPP

#include <vector>

namespace messaging{

template<typename T> class IMessageListener;

template <typename T> class IMessageContext {

    std::vector<IMessageListener<T>* > _listeners;

public:
    template<typename T2>
    void attachListener(IMessageListener<T>* _listener){
        _listeners.push_back(_listener);
    }

    template<typename T2>
    void detach(IMessageListener<T>* _listener){
        _listeners.erase(std::remove(_listeners.begin, _listeners.end(), _listener), _listeners.end());
    }

    template<typename T2>
    void send(const T& _msg){
        typename std::vector<IMessageListener<T>* >::iterator i;
        for(i = _listeners.begin(); i != _listeners.end(); ++i){
            (*i)->handleMessage(_msg);
        }
    } };

template<typename T> class IMessageListener { public:
    virtual void handleMessage(const T&); };

} //namespace messaging

#endif // MESSAGING_HPP

派生类:

class context : public messaging::IMessageContext<int>
{
public:
    void go(const int &i)
    {
        send<int>(i);
    }
};

class listener : public messaging::IMessageListener<int>
{
public:
    virtual void handleMessage(const int &i){
        std::cout << i << std::endl;
    }
};

主要功能:

int main()
{
    context c;
    listener l;
    c.attachListener<int>(&l);
    c.go(1234);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

您尚未提供IMessageListener<T>::handleMessage的定义:

template<typename T> class IMessageListener { public:
    virtual void handleMessage(const T&); 
    //                                  ^
};

如果您打算将其保留为未实现,请将其设为纯虚拟:

template<typename T> class IMessageListener { public:
    virtual void handleMessage(const T&) = 0;
    //                                   ^^^
};