Шаблоны абстрактного базового класса C ++ - PullRequest
2 голосов
/ 20 января 2011

Что не так в этом коде?

template <class T>
class A
{
private:
    T a;

public:
    A(): a(0) {}
    virtual ~ A() = 0;
};


template <class T>
class A;

template <class T>
class B : public A<T>
{
private :
    T b;

public:
    B() : A<T>() {}
    virtual ~B(){}


};


int _tmain(int argc, _TCHAR* argv[])
{
B <double> bb;
return 0;
}

ошибка LNK2019: неразрешенный внешний символ "public: virtual __thiscall A :: ~ A (void)" (?? 1? $ A @ N@@ UAE @ XZ) ссылка в функции "public: virtual __thiscall B :: ~ B (void)" (?? 1? $ B @ N @@ UAE @ XZ)

Ответы [ 3 ]

9 голосов
/ 20 января 2011

Вы объявляете деструктор A как чисто виртуальный. Это все хорошо, и может считаться хорошей практикой, если вы хотите гарантировать, что класс никогда не будет создан. Однако вы все равно должны определить A::~A() где-то в своем коде, поскольку деструктор B автоматически вызывает A::~A() для объекта B. Поскольку вы объявили его чисто виртуальным, вы не можете определить его встроенным, как вы это сделали с ~B; вы должны включить его определение вне определения класса.

0 голосов
/ 20 января 2011

Ваш деструктор суперкласса не должен быть чисто виртуальным, просто виртуальным.

virtual ~A() {}

Деструктор B автоматически попытается вызвать деструктор A.

0 голосов
/ 20 января 2011

Вам необходимо предоставить реализацию для деструктора базового класса. Даже если деструктор объявлен чисто виртуальным, для уничтожения производных классов требуется реализация.

...