c++ - 继承自非专用模板(共享库)

标签 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 不提供对完整类实现的访问权限有什么关系吗?在这种情况下,EventHandler 模板在 .cpp 中没有任何附加定义,因为它只是一个纯虚拟方法。

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

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

最佳答案

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

关于c++ - 继承自非专用模板(共享库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48382294/

相关文章:

C++ 在派生类中更改成员类型

python - 继承时避免 __init__ 和 super 样板

c++ - 如何专门化字符串数组的模板?

c++ - 字符串参数

c++ - 为什么数组到指针的输出不相关

c++ - 为什么 SFML Xcode 不使用 C++ 加载我的 .png 文件?

php - 为什么要使用带有框架的模板引擎?

C++:模板类二元运算符重载 - 段错误?

oop - 我应该使用继承吗?

C++ : a helper to compare variadic unsigned int templates parameters