C++ 模板类特化 : why do common methods need to be re-implemented

标签 c++ templates specialization

在示例中:

#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/

相关文章:

c++ - uuid_generate_random (libuuid) 在 solaris 上

c++ - 使用 SFINAE 有条件地解析分配器成员

c++ - 这个结构继承的类型是什么?

c++ - 你会如何转置二进制矩阵?

c++ - Qt utf-16 输出在 Windows cmd 和 powershell 中显示问号——在 C++ 中具有最小可重现示例

C++ 模板黑魔法

c++ - 模板 <> 不工作或用于整数

c++ - 专门针对 const 成员函数指针

swift - 间接调用在 Swift 3 中调用了错误的专用泛型函数

c++ - Boost、异常、线程和异步,我该如何处理?