链接器看不到基类中定义的模板函数(纯虚拟)class

Linker does not see template function defined in a base (pure virtual) class

代码如下:

class PureDummy
{
    public:
        virtual void foo() = 0;
        template<class T>
        void bar();
};

class Dummy : public PureDummy
{
    public:
        virtual void foo() 
        {

        }
        template<class T>
        void bar()
        {

        }
};

int main(int argc, char **argv)
{
    PureDummy *pdummy = new Dummy();
    pdummy->foo(); //OK
    //pdummy->bar<int>();  //undefined reference to `void PureDummy::bar<int>()'
}

正如评论所述,调用 bar 编译失败。

  1. 为什么模板函数表现出与 "regular" foo 函数不同的行为?

  2. 是否有可能 "point" 在派生的 class 中有一个实现?

您正在调用 PureDUmmy::bar 并且没有提供它的定义。

实际结果是链接错误。

为了能够覆盖派生 class 中的函数以实现运行时多态性(因为您显然是在尝试通过指向基 class 的指针进行调用),它需要成为 virtual。 C++ 不支持 virtual 函数的模板化。一种可能的解决方案,适用于某些情况,是用编译时多态代替运行时多态,并使用 CRTP。

pdummy的静态类型是PureDummy *所以编译器会先检查PureDummyclass这样的函数。一个存在并且可以访问,因此它将尝试调用。该函数是非虚拟的(模板不能是虚拟的)因此它将尝试调用 PureDummy::bar。此函数没有定义,因此 link 失败并出现未定义的符号错误。