C++模板类vtable函数突然不在共享库中生成了

问题描述

我正在开发一个共享库(Linux 和 Windows,当前测试在 Linux 上使用 gcc 运行)。这个库的一部分是一个非常复杂的命令行解析器,使用类模板和普通类。

继承路径是这样的(我这里省略了命名空间):

// normal class for polymorphism
class _tArgTypeBaseClass; 

// class template (CRTP idea) for implementing common code
template<class C,typename T> class _tArg : public _tArgTypeBaseClass; 

// example class (multiple types have been implemented
class TIntegerValueList : public _tArg<TIntegerValueList,int32_t>

// template class to implement non list specialization
template<class PARENT,typename T> class _tArgNoList : public PARENT

// typedef (currently typedef,I kNow I Could be using "using")
typedef _tArgNoList<TIntegerValueList,uint32_t> TIntegerValue;

在这个类树中,简单的模板方法在头文件中实现,但更复杂的方法在 cpp 单元文件中。

目前,我正在使用 google test 测试库,并且过去一切正常,即 cpp 方法都可用于 google 测试程序来运行其测试。这些测试目前都只使用 TIntegerValueList(还没有其他类型,也没有 T...Value 特化。

我还必须注意,所有 _tArg 模板方法过去都是在基类 _tArgTypeBaseClass 中声明为纯虚拟的虚方法

现在我对类树做了一些更改,最终测试程序不再链接链接器报告对 _tArg(又名 int32_t)中所有 vtable 方法的未知引用

引入该问题的更改可能是现在我将一种方法更改为非虚拟方法,因为它变得依赖于类型。请注意,这是 TIntegerValueList 的方法(不是模板 _tArg)。所以我注释掉了纯虚方法声明,并从 TxxxValueList 类中的实际方法删除了 override 关键字。

有人解释为什么会发生这种情况吗?

PS:我知道我可以通过模板类 _tArg 强制实例化;最好使用头文件中的 extern 模板,我目前将其作为一种解决方法。但如果可能的话,我更愿意避免这种情况,因为在添加新值类型时它很容易出错。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)