GCC 4.7.2 编译此代码如下:
Obj::getNumber()
对in的引用Obj::defaultNumber()
是内联的- 的正文
Obj::getNumber()
是单独编译和导出的,并且可以从不同的翻译单元链接到。
VC++2012 在链接步骤失败:
Error 1 error LNK2001: unresolved external symbol "public: virtual int __thiscall Obj::getNumber(unsigned int)"
在main.obj
VC++ 似乎是在符号表中内联调用,Obj::defaultNumber()
而不是getNumber()
在符号表中导出。
VC++ 可以通过以下方式之一编译它:
- 从定义中删除
inline
关键字getNumber()
,或 - 从声明中删除
virtual
关键字(为什么!?)getNumber()
乍一看,GCC 的行为似乎更有帮助/直观。也许熟悉标准的人可以在这里为我指明正确的方向。
- 在这种情况下,任何一个编译器都有符合的行为吗?
- 如果方法是非虚拟的,为什么 VC++ 可以工作?
.
// Obj.h
class Obj
{
public:
virtual int getNumber(unsigned int i);
virtual int defaultNumber();
};
// Obj.cpp
static const int int_table[2] = { -1, 1 };
inline int Obj::getNumber(unsigned int i)
{
return int_table[i];
}
int Obj::defaultNumber()
{
return getNumber(0);
}
// main.cpp
#include <iostream>
#include "Obj.h"
int main()
{
Obj obj;
std::cout << "getNumber(1): " << obj.getNumber(1) << std::endl;
std::cout << "defaultNumber(): " << obj.defaultNumber() << std::endl;
}