undefined ссылка на `vtable для шаблона

У меня есть класс шаблона, который наследуется от класса интерфейса и, следовательно, имеет виртуальные функции

//abstract.h
class Abstract {
virtual void abc();
Abstract();
}
//Abstract.cpp
Abstract::Abstract()
{ //do some init}

//concrete.h
class Impl {
public:
    void abcImpl();
};

template<typename T>
class Concrete : public Abstract, public T {
virtual void abc();
};
template<typename T>
Concrete<t>::abc()  { static_cast<T>(*this).abcImpl(); }

//concrete.cpp
void Impl::abc() { std::cout << "abc"; }

Используется здесь

//foo.cpp
Concrete<Impl> *var1 = new Concrete<Impl>();

Во время компоновки я получаю сообщение об ошибке undefined ссылка на `vtable for Abstract '

В прошлом эта ошибка указала, что компилятор не мог найти место для размещения vtable, потому что не было файла cpp, связанного с этим классом. Другими словами, он помещает vtable туда, где сначала находит первое невиртуальное определение любой функции-члена. Но это вызывает недоумение, т.к. 1. Я не уверен, почему он жалуется на Abstract - Abstract действительно имеет cpp 2. Может быть, сообщение об ошибке действительно означает Бетон? Но Concrete не может быть в файле cpp, потому что он шаблонный. Итак, как в целом решить эту проблему при работе с шаблонным классом, который также имеет виртуальные функции?

6
задан excalibur 13 February 2012 в 19:30
поделиться