有问题的项目是关于彼此沟通的不同端点。端点发送事件(超出当前问题的范围)并可以处理传入事件。每个事件都在通用对象中表示如下:
#pragma interface
... // some includes
template<typename T>
class Event
{
public:
Event(int senderId, Type type, T payload); // Type is an enum
Event(int senderId, Type type, int priority, T payload);
virtual ~Event();
virtual int getSenderId();
virtual int getPriority();
virtual T getPayload();
void setPriority(const int priority);
protected:
const int senderId;
const Type type;
const T payload;
int priority;
};
它的实现类带有#pragma implementation tag。
端点定义如下:
#pragma interface
#include "Event.h"
template<typename T>
class AbstractEndPoint
{
public:
AbstractEndPoint(int id);
virtual ~AbstractEndPoint();
virtual int getId();
virtual void processEvent(Event<T> event) = 0;
protected:
const int id;
};
它也有它的实现类,但只定义了构造函数,析构函数和getId()。
我们的想法是为每种不同的有效负载类型创建具体的端点。因此,我为每种类型都有不同的有效负载对象和特定的事件类,例如
Event<TelegramFormatA>, Event<TelegramFormatB>
和
ConcreteEndPoint for TelegramFormatA,
ConcreteEndPoint for TelegramFormatB
分别。后面的类定义为
class ConcreteEndPoint : AbstractEndPoint<TelegramFormatA>
{
...
}
我正在使用g ++ 4.4.3和ld 2.19。所有东西编译得很好,但是链接器抱怨对类型特定事件类的未定义引用,比如
Event<TelegramFormatA>::Event(....) .
我尝试使用
进行显式实例化template class AbstractEndPoint<TelegramFormatA>;
但无法解决上述链接器错误。
任何想法都会受到赞赏。
答案 0 :(得分:3)
类模板的函数模板和成员函数必须在头文件中实现,而不是在.cpp文件中实现。我想你在.cpp文件中实现了Event<T>::Event()
?
答案 1 :(得分:0)
正如sbi已经指出的那样,不允许在源文件和头文件中分离模板的接口和实现。请查看此链接了解详细信息(页面末尾)http://www.cplusplus.com/doc/tutorial/templates/
答案 2 :(得分:0)
我刚刚找到了解决方案。信不信由你,它与GNU链接器(ld)的v2.20完美地链接,但是没有用ld 2.19这样做。
顺便说一下
#pragma interface
和
#pragma implementation
是一个特定于g ++的解决方法,解决了在头文件中实现模板类的问题。使用pragma标签可以避免,所以这不是问题,但无论如何,谢谢你的建议。