从非专用模板(共享库)继承

时间:2018-01-22 13:06:55

标签: c++ templates inheritance linker shared-libraries

当我直接从共享库类模板继承时,我得到“未解析的外部符号”,但如果我首先在我的代码中专门化库模板,它可以正常工作。

共享库中的模板类:

template <typename T>
class EventHandler
{
public:
    virtual ~EventHandler();
    virtual EventResult ReceiveEvent(T * evn, EventDispatcher<T> * dispatcher) = 0; 
};

我的代码中的派生类(没有专业化时无效):

class MyEventHandler : public EventHandler<SomeEventType>
{
public:
    virtual     EventResult    ReceiveEvent(SomeEventType * evn, EventDispatcher<SomeEventType> * dispatcher);
};

我的代码中的专业库模板类:

template <>
class EventHandler<SomeEventType>
{
public:
    virtual ~EventHandler() {}
    virtual EventResult ReceiveEvent(SomeEventType * evn, EventDispatcher<SomeEventType> * dispatcher) = 0;
};

我尝试直接在共享的lib代码中复制它(我有源代码),并且没有模板专业化它工作正常。是否与lib无关,无法访问全班实现?在这种情况下,EventHandler模​​板在.cpp中没有任何其他定义,因为它只是一个纯虚方法。

如果重要的话,我的派生类也在命名空间内。

[EDIT]类模板EventHandler在.cpp文件中没有任何其他实现,上面从.h文件发布的这个定义就是它所做的一切(一个纯虚函数)。它与建议的可能重复的线程无关。

1 个答案:

答案 0 :(得分:5)

原因是您的EventHandler课程中没有析构函数定义。你的专业化会使它超载,所以编译器没有定义。注意,这是必须在头文件中定义的代码,而不是在cpp文件中(因此,作为库二进制文件的一部分),因为编译器必须为EventHandler模板类型的每个类型实例化新定义是专门的/实例化的。