这是代码:
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编译失败 .
-
为什么模板函数表现出与"regular" foo 函数不同的行为?
-
是否有可能“指出”派生类中有实现?
2 回答
pdummy
的静态类型是PureDummy *
,因此编译器将首先检查PureDummy
类是否有这样的函数 . 一个存在且可访问,因此它将尝试呼叫 . 该功能是非虚拟的(模板不能是虚拟的),因此它将尝试调用PureDummy::bar
. 此函数没有定义,因此链接因未定义的符号错误而失败 .你正在调用
PureDUmmy::bar
并且没有提供它的定义 .实践结果是链接错误 .
为了能够在派生类中覆盖运行时多态的函数(因为您显然是通过指向基类的指针尝试调用),它需要
virtual
. C不支持virtual
函数的模板化 . 在某些情况下适用的一种可能的解决方案是将编译时多态性替换为运行时多态,并使用CRTP .