Especialización de clase de plantilla de C ++: ¿por qué los métodos comunes deben volver a implementarse?

En la muestra:

#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;
}

Obtuve el siguiente error

test.cpp:(.text+0x1c): undefined reference to `D<bool>::D()'

Tenga en cuenta que la razón por la que no me especializo solo en D () es que quiero eliminar la necesidad de cadenaD<T>::data en elD<bool> case.

¿Por qué necesito volver a implementarD() inD<bool>? Parece que debería haber una manera de decirle al compilador que use la versión deD<T>.

¿Hay alguna forma de hacer una especialización simple como esta sin tener que volver a implementar métodos?

Respuestas a la pregunta(10)

Su respuesta a la pregunta