【发布时间】:2012-08-18 23:31:09
【问题描述】:
虽然还有其他关于堆栈溢出的问题涉及“未定义对 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() {}
Main.cpp
#include "Header.h"
int main()
{
return 0;
}
以下不相关的更改允许编译:
- 从 Implementation.cpp 中删除 C::C() 的非内联实现
- 将 C() 的简单内联实现添加到 Header.h 中的类
为什么这允许编译?这是编译器错误、优化器问题还是标准惊喜的暗角?
【问题讨论】:
标签: c++ constructor compiler-errors g++ vtable