У меня есть класс шаблона, который наследуется от класса интерфейса и, следовательно, имеет виртуальные функции
//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, потому что он шаблонный. Итак, как в целом решить эту проблему при работе с шаблонным классом, который также имеет виртуальные функции?