虽然还有其他关于堆栈溢出的问题处理“未定义对 vtable 的引用”错误消息。以下代码编译或不编译取决于无参数构造函数 C() 是否内联实现。我知道成员函数 m() 应该是纯虚拟的,这将是为了解决问题而做出的正确更改。令我困惑的是,它可以通过明显不相关的更改进行编译。
以下代码不能使用 g++ 编译(在 ubuntu 64 位上为 4.6.3)并产生预期的“未定义对 C 的 vtable 的引用”消息(考虑到问题出在 m() 上,这仍然是一个可怕的错误消息)
头文件.h
#ifndef HEADER_H
#define HEADER_H
class C
{
public:
C();
virtual void m();
};
#endif
实现.cpp
#include "Header.h"
C::C() {}
主文件
#include "Header.h"
int main()
{
return 0;
}
以下不相关的更改允许编译:
- 从 Implementation.cpp 中删除 C::C() 的非内联实现
- 将 C() 的简单内联实现添加到 Header.h 中的类
为什么这允许编译?这是编译器错误、优化器问题还是标准惊喜的黑暗角落?