链接器没有看到在基本(纯虚拟)类中定义的模板函数

时间:2015-02-25 16:55:22

标签: c++ templates c++11

以下是代码:

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. 为什么模板功能与“常规” foo 功能表现出不同的行为?

  2. 是否有可能“指出”派生类中有实现?

2 个答案:

答案 0 :(得分:2)

pdummy的静态类型是PureDummy *,因此编译器将首先检查PureDummy类以获取此类函数。一个存在且可访问,因此它将尝试呼叫。该功能是非虚拟的(模板不能是虚拟的),因此它将尝试调用PureDummy::bar。此函数没有定义,因此链接因未定义的符号错误而失败。

答案 1 :(得分:0)

您正在调用PureDUmmy::bar并且尚未提供其定义。

实践中的结果是链接错误。

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