Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从非专用模板继承(共享库)_C++_Templates_Inheritance_Linker_Shared Libraries - Fatal编程技术网

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

C++ 从非专用模板继承(共享库),c++,templates,inheritance,linker,shared-libraries,C++,Templates,Inheritance,Linker,Shared Libraries,当我直接从共享库类模板继承时,我得到了“未解析的外部符号”,但如果我首先在代码中专门化库模板,它就可以正常工作 共享库中的模板类: template <typename T> class EventHandler { public: virtual ~EventHandler(); virtual EventResult ReceiveEvent(T * evn, EventDispatcher<T> * dispatcher) = 0; }; 模板

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

共享库中的模板类:

template <typename T>
class EventHandler
{
public:
    virtual ~EventHandler();
    virtual EventResult ReceiveEvent(T * evn, EventDispatcher<T> * dispatcher) = 0; 
};
模板
类事件处理程序
{
公众:
虚拟~EventHandler();
virtual EventResult ReceiveEvent(T*evn,EventDispatcher*dispatcher)=0;
};
我的代码中的派生类(没有专门化就无法工作):

MyEventHandler类:公共事件处理程序
{
公众:
虚拟事件结果ReceiveEvent(SomeEventType*evn,EventDispatcher*dispatcher);
};
我的代码中的专用库模板类:

template <>
class EventHandler<SomeEventType>
{
public:
    virtual ~EventHandler() {}
    virtual EventResult ReceiveEvent(SomeEventType * evn, EventDispatcher<SomeEventType> * dispatcher) = 0;
};
模板
类事件处理程序
{
公众:
虚拟~EventHandler(){}
virtual EventResult ReceiveEvent(SomeEventType*evn,EventDispatcher*dispatcher)=0;
};
我尝试直接在共享库的代码中复制它(我有源代码),它在没有模板专门化的情况下运行良好。它是否与lib不允许访问完整类实现有关?在本例中,EventHandler模板在.cpp中没有任何其他定义,因为它只是一个纯虚拟方法

如果有必要,我的派生类也在名称空间中


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

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

@GuillaumeRacicot的可能重复添加了解释为什么我的问题不是“可能重复”啊。那么您的函数只需要一个实现,但如果我直接在共享库的代码中实现了
MyEventHandler
,为什么不需要专门化呢?
EventHandler
的析构函数仍然没有定义,但它编译时没有问题。@ZaxFtw:对于您在这里介绍的代码,我认为这是不可能的-我猜,例如,您的共享库意外地将其定义隐藏在某个内部头文件中,它对MyEventHandler实现可见,但对库外的代码不可见。以下是coliru上的代码:将空析构函数定义添加到模板代码
~EventHandler(){}
中,但意外删除了
=0是什么使得函数不再纯粹,类不再抽象,并且由于一些未知的原因它无法工作。现在,当两者都返回(zero和destructor)时,它终于可以编译了。
template <>
class EventHandler<SomeEventType>
{
public:
    virtual ~EventHandler() {}
    virtual EventResult ReceiveEvent(SomeEventType * evn, EventDispatcher<SomeEventType> * dispatcher) = 0;
};