在示例中:
#include <iostream>
using namespace std;
class B
{
public:
virtual void pvf() = 0;
};
template <class T>
class D : public B
{
public:
D(){}
virtual void pvf() {}
private:
string data;
};
template <>
class D<bool> : public B
{
public:
D();
virtual void pvf(){ cout << "bool type" << endl; }
};
int main()
{
D<int> d1;
D<bool> d2;
}
我收到以下错误:
test.cpp:(.text+0x1c): undefined reference to `D<bool>::D()'
请注意,我不只是专门化 D() 本身的原因是我想消除对字符串 D<T>::data
的需要。在 D<bool>
案例。
为什么需要重新实现D()
在 D<bool>
?似乎应该有一种方法让我告诉编译器使用 D<T>
中的版本.
有没有什么方法可以做这样一个简单的特化而不必重新实现方法?
最佳答案
类模板的每个特化都提供一个不同的类——它们之间不共享任何成员。由于您已经明确地专门化了整个类,因此您不会从模板中获取任何成员,并且必须全部实现它们。
您可以明确地专门化个别成员,而不是整个类:
template <> void D<bool>::pvf(){ cout << "bool type" << endl; }
然后 D<bool>
仍将包含您尚未明确特化的类模板的所有成员,包括默认构造函数。
关于C++ 模板类特化 : why do common methods need to be re-implemented,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8789867/