我能告诉你';“vtable”的未定义引用是什么? 我有一个C++类,用来模仿C的接口,比如: class Foo { public: virtual void baa(); } 这是一个编译Queon on释放的大型QtC++项目,但是我在调试模式下编译时得到了这个错误:
对vtable的未定义引用 我知道这个错误的意思:没有定义虚拟方法,对吗?我的问题是: 它只在调试时发生,我不知道为什么。我能找到我没有定义该方法的源(即类)吗 我愿意使用Qt本身、编译器选项、外部工具或其他任何东西 我能找到我没有定义该方法的源(即类)吗 对我来说,第一个嫌疑犯是我能告诉你';“vtable”的未定义引用是什么? 我有一个C++类,用来模仿C的接口,比如: class Foo { public: virtual void baa(); } 这是一个编译Queon on释放的大型QtC++项目,但是我在调试模式下编译时得到了这个错误:,c++,qt,mingw,undefined-reference,virtual-functions,C++,Qt,Mingw,Undefined Reference,Virtual Functions,对vtable的未定义引用 我知道这个错误的意思:没有定义虚拟方法,对吗?我的问题是: 它只在调试时发生,我不知道为什么。我能找到我没有定义该方法的源(即类)吗 我愿意使用Qt本身、编译器选项、外部工具或其他任何东西 我能找到我没有定义该方法的源(即类)吗 对我来说,第一个嫌疑犯是类Foo本身。检查其中是否包含void baa()的定义。如果未定义Foo::baa(),则无法执行以下操作: Foo foo; foo.baa(); // undefined reference for `Foo:
类Foo
本身。检查其中是否包含void baa()
的定义。如果未定义Foo::baa()
,则无法执行以下操作:
Foo foo;
foo.baa(); // undefined reference for `Foo::baa()`
现在,如果您确实定义了Foo::baa()
,那么可能是Foo
的其他子类出现了这个错误(但是我注意到g++提到了哪个子类,奇怪的是为什么您看不到它)
一种简单的方法是临时将Foo::baa
设置为纯虚拟
class Foo {
public: virtual void baa () = 0;
};
在这种情况下,无论哪个子类不重写此方法,都将生成编译器错误。由于行号等原因,这将使您的查找更容易
为什么它在调试模式下给出链接器错误是非常主观的,需要更多信息。您使用的是哪种编译器,您可以发布用于调试和发布的编译器命令吗?通常这意味着您声明了一个
虚拟
函数,但没有提供主体。除纯虚函数外,所有虚函数都必须有实体。即使它们没有被调用。@M.M,尽管为所有virtual
方法提供主体是很好的,但准确地说,只需要那些包含类对象的方法主体被实例化。例如,如果我有类B
及其派生的类D
。如果我没有创建B
的任何对象并调用virtualvoid f()代码>然后我仍然可以使用未定义的虚拟方法。顺便说一句,在纯virtual
方法的情况下,即使主体不是强制性的,也可以在类主体之外定义它。@iammilind instantingD
实例化B
@M.M,通过D
实例化B
,甚至显式实例化B
仍然可以。但是,不应该出现这样的情况,即最终通过B&
或B*
或B
调用virtual f()
。只有在这种情况下,链接器错误才会弹出。在这一点上,我试图涵盖几个案例。
class Foo {
public: virtual void baa () = 0;
};