我有一个模板类,它继承自接口类并且包含虚函数。
在链接时,我收到一个错误:undefined reference to `vtable for Abstract'。
过去,这个错误表示编译器找不到放置虚函数表的位置,因为该类没有与cpp文件相关联。换句话说,它会将虚函数表放在第一个非虚拟函数成员定义的地方。
但是这很令人困惑,因为: 1. 我不确定为什么它抱怨Abstract - Abstract实际上有一个cpp文件。 2. 可能错误消息实际上意味着Concrete?但是Concrete不能在cpp文件中,因为它是模板化的。
那么,在处理具有虚函数的模板类时,通常如何解决此问题?
//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 reference to `vtable for Abstract'。
过去,这个错误表示编译器找不到放置虚函数表的位置,因为该类没有与cpp文件相关联。换句话说,它会将虚函数表放在第一个非虚拟函数成员定义的地方。
但是这很令人困惑,因为: 1. 我不确定为什么它抱怨Abstract - Abstract实际上有一个cpp文件。 2. 可能错误消息实际上意味着Concrete?但是Concrete不能在cpp文件中,因为它是模板化的。
那么,在处理具有虚函数的模板类时,通常如何解决此问题?
Concrete
类没有继承自Abstract
类。请注意,Abstract::abc()
函数不是纯虚函数,因此必须定义。 - hmjd