模板的虚函数表未定义引用

6
我有一个模板类,它继承自接口类并且包含虚函数。
//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文件中,因为它是模板化的。
那么,在处理具有虚函数的模板类时,通常如何解决此问题?

4
这是实际的代码吗?Concrete类没有继承自Abstract类。请注意,Abstract::abc()函数不是纯虚函数,因此必须定义。 - hmjd
可能是 [Undefined symbols "vtable for ..." and "typeinfo for..."?] 的重复问题。(https://dev59.com/unI-5IYBdhLWcg3wwLS3) - Mike Seymour
1个回答

3
问题可能是由于abc()方法没有声明为纯虚函数导致的。例如,GCC将使用abc()作为vtable放置的关键方法,因为它是在类中第一个非内联、非纯虚方法(详情请参见:http://gcc.gnu.org/onlinedocs/gcc/Vague-Linkage.html)。如果您将abs()声明为纯虚函数,它应该会将vtable放置在定义构造函数的Abstract.cpp文件中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接