我最近在编译不同单元时使用带有模板基类的NVI时遇到了这个问题。如果我有两个派生自我的基类的类具有相同的模板参数(但行为不同),我得到HandleData()的多符号定义错误,即基类中的间接方法。
另外将HandleData()标记为内联并未更改错误。包容性防护措施到位且正确。
我很感激任何想法!
更新 主要问题似乎是模板实例化:如果我将两个单元测试放在同一个文件中,它们运行正常 - 只有在相同DLL的不同文件(编译单元)中实例化派生类时才会出现问题(UnitTest.dll,我碰巧使用CPPUnit btw。)
基类(在DLL X中):
template <class DataType>
class cDataHandlerBase
{
public:
virtual ~cDataHandlerBase();
bool HandleData(const std::vector<DataType>& data)const
{
return doHandleData(data);
}
protected:
cDataHandlerBase();
private:
virtual bool doHandleData(const std::vector<DataType>& data)const = 0;
};
派生类(在DLL Y中,文件A和B中):
class cDataHandlerA : public cDataHandlerBase<SomeType>
{
virtual bool doHandleData(const std::vector<DataType>& data)const override;
};
class cDataHandlerB : public cDataHandlerBase<SomeType> //same type as cDataHandlerA!
{
virtual bool doHandleData(const std::vector<DataType>& data)const override;
};
UnitTest-DLL包含文件TestA和TestB,在编译这些文件后,我得到了cDataHandlerBase :: HandleData()的多个定义。