C ++抽象类模板+特定于类型的子类=带链接器的问题

时间:2010-05-05 10:18:53

标签: c++ inheritance templates

有问题的项目是关于彼此沟通的不同端点。端点发送事件(超出当前问题的范围)并可以处理传入事件。每个事件都在通用对象中表示如下:

#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>;

但无法解决上述链接器错误。

任何想法都会受到赞赏。

3 个答案:

答案 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标签可以避免,所以这不是问题,但无论如何,谢谢你的建议。