代码如下:
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 编译失败。
为什么模板函数表现出与“常规”foo 函数不同的行为?
是否可以“指出”派生类中有一个实现?
最佳答案
pdummy
的静态类型是PureDummy *
所以编译器会首先检查PureDummy
类是否有这样的函数。一个存在并且可以访问,因此它将尝试调用。该函数是非虚拟的(模板不能是虚拟的),因此它将尝试调用 PureDummy::bar
。此函数没有定义,因此链接失败并出现 undefined symbol 错误。
关于c++ - 链接器看不到基类(纯虚拟)中定义的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28724925/