从非专用模板(共享库)继承
Inherit from non-specialized template (shared library)
当我直接从共享库 class 模板继承时,我得到 "Unresolved External Symbols",但是如果我先在我的代码中专门化库模板,它工作正常。
共享库中的模板 class:
template <typename T>
class EventHandler
{
public:
virtual ~EventHandler();
virtual EventResult ReceiveEvent(T * evn, EventDispatcher<T> * dispatcher) = 0;
};
在我的代码中派生 class(没有专门化就无法工作):
class MyEventHandler : public EventHandler<SomeEventType>
{
public:
virtual EventResult ReceiveEvent(SomeEventType * evn, EventDispatcher<SomeEventType> * dispatcher);
};
我的代码中的专用库模板class:
template <>
class EventHandler<SomeEventType>
{
public:
virtual ~EventHandler() {}
virtual EventResult ReceiveEvent(SomeEventType * evn, EventDispatcher<SomeEventType> * dispatcher) = 0;
};
我尝试在共享库的代码中直接复制它(我有源代码)并且它在没有模板专业化的情况下工作正常。它与 lib 不提供完整 class 实现的访问权限有什么关系吗?在这种情况下,EventHandler 模板在 .cpp 中没有任何其他定义,因为它只是一个纯虚拟方法。
如果重要的话,我派生的 classes 也在命名空间内。
[编辑] class EventHandler
的模板在 .cpp 文件中没有任何额外的实现,上面从 .h 文件发布的这个定义就是它所做的一切(一个纯虚函数) .它与建议可能重复的线程无关。
原因是您的 EventHandler
class 中没有析构函数定义。您的专业化确实使它超载,因此编译器不会没有定义。请注意,这是必须在头文件中定义的代码,而不是在 cpp 文件中(因此,是库二进制文件的一部分),因为编译器必须为 EventHandler
模板类型的每种类型实例化新定义是 specialized/instantiated。
当我直接从共享库 class 模板继承时,我得到 "Unresolved External Symbols",但是如果我先在我的代码中专门化库模板,它工作正常。
共享库中的模板 class:
template <typename T>
class EventHandler
{
public:
virtual ~EventHandler();
virtual EventResult ReceiveEvent(T * evn, EventDispatcher<T> * dispatcher) = 0;
};
在我的代码中派生 class(没有专门化就无法工作):
class MyEventHandler : public EventHandler<SomeEventType>
{
public:
virtual EventResult ReceiveEvent(SomeEventType * evn, EventDispatcher<SomeEventType> * dispatcher);
};
我的代码中的专用库模板class:
template <>
class EventHandler<SomeEventType>
{
public:
virtual ~EventHandler() {}
virtual EventResult ReceiveEvent(SomeEventType * evn, EventDispatcher<SomeEventType> * dispatcher) = 0;
};
我尝试在共享库的代码中直接复制它(我有源代码)并且它在没有模板专业化的情况下工作正常。它与 lib 不提供完整 class 实现的访问权限有什么关系吗?在这种情况下,EventHandler 模板在 .cpp 中没有任何其他定义,因为它只是一个纯虚拟方法。
如果重要的话,我派生的 classes 也在命名空间内。
[编辑] class EventHandler
的模板在 .cpp 文件中没有任何额外的实现,上面从 .h 文件发布的这个定义就是它所做的一切(一个纯虚函数) .它与建议可能重复的线程无关。
原因是您的 EventHandler
class 中没有析构函数定义。您的专业化确实使它超载,因此编译器不会没有定义。请注意,这是必须在头文件中定义的代码,而不是在 cpp 文件中(因此,是库二进制文件的一部分),因为编译器必须为 EventHandler
模板类型的每种类型实例化新定义是 specialized/instantiated。