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

标签 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. 是否可以“指出”派生类中有一个实现?

最佳答案

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

关于c++ - 链接器看不到基类(纯虚拟)中定义的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28724925/

相关文章:

java - Eclipse 显示错误,而 ndk_build 成功

c++ - 逆向工程全局热键 block

c++ - 在模板类中编写的 lambda 函数不支持 restrict(...) 吗?

c++ - 可变参数函数中可变参数模板类的隐式转换

c++ - 为什么这个 move 构造函数如此贪婪?

c++ - 为什么 SFINAE 不能与 std::enable_if_t 一起使用?

c++ - MSbuild 错误 : The builds tools for v140 (Platform Toolset = 'v140' ) cannot be found

C++ 函数返回/输入引用类型

c++ - 模板类需要模板参数吗?

c++ - makefile 不适用于 -std=c++11 选项