具有模板基类的非虚拟公共接口(NVI) - 多个符号定义

时间:2017-04-19 12:20:45

标签: c++ templates design-patterns

我最近在编译不同单元时使用带有模板基类的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()的多个定义。

0 个答案:

没有答案