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