如何链接重载的模板方法

时间:2016-06-09 16:06:54

标签: c++ templates

我使用以下代码获得以下链接器错误:

template<class T_Extendable> class IBase { public: virtual ~IBase() = default; virtual const std::string& Name() const = 0; }; template<class T_Extendable> class Base : public IBase<T_Extendable> { public: virtual ~Base() { "Destructing " << Name(); } // use virtual function Name() }; class Derived : public Base<Foo> { public: virtual ~Derived() = default; const std::string& Name() const final { return "Derived"; } // implement pure virtual method IBase::Name() }; IBase :: Name()const'`

注意在Base类中,它调用虚函数Name()。目的是调用Derived类的Name实现,但链接器正在查找IBase :: Name,而不是Derived :: Name()。如何解决这个问题?

File "$%MY_ENV_VAR%\..\..\Other Stuff\myFile.txt"

1 个答案:

答案 0 :(得分:3)

您正在从析构函数中调用虚函数。通过标准的对象生存期规则,这意味着即使被销毁的对象是Derived,当Base析构函数运行时,它也不再能够访问派生最多的类型(在此case Derived的)虚函数覆盖。因此,它尝试调用IBase中声明的版本,该版本未定义,因此会出现链接器错误。

注意:这是标准的相关部分,它指定了这种行为[class.cdtor]:

  

可以调用4个成员函数,包括虚函数(10.3)   在施工或毁坏期间(12.6.2)。当一个虚函数   从构造函数或从构造函数直接或间接调用   析构函数,包括在构造或破坏期间   class的非静态数据成员,以及调用的对象   适用于建造或销毁的对象(称之为x),   调用的函数是构造函数中的最终重写者   析构函数的类,而不是在更派生的类中重写它