显然,MSVC2005未能内联本地类的成员函数,导致LNK2005。
编译以下内容时,我遇到此LNK2005错误:
common.h
内容:
inline void wait_what()
{
struct wtf
{
void ffffuuu() {}
} local;
}
foo.cpp
内容:
#include "common.h"
void foo()
{
wait_what();
}
bar.cpp
内容:
#include "common.h"
void bar()
{
wait_what();
}
LNK2005.cpp内容:
// forward declarations
void foo();
void bar();
int main()
{
foo();
bar();
return 0;
}
错误消息是:
error LNK2005: "public void __thiscall `void__cdecl wait_what(void)'::`2'::wtf::ffffuuu(void)" (?ffffuuu@wtf?1??wait_what@@YAXXZ@QAEXXZ) already defined in bar.obj
关于本地课程,ISO IEC 14882-2003说:
9.8本地班级声明
可以在函数定义中定义类;这样的类称为 local 类。本地类的名称是其封闭范围的本地名称。本地类位于封闭范围的范围内,并且对函数外部的名称具有与封闭函数相同的访问权限。本地类中的声明只能使用类型名称,静态变量,外部变量和函数以及封闭范围内的枚举器。
封闭函数对本地类的成员没有特殊访问权限;它遵守通常的访问规则(第11条)。本地类的成员函数应在其类定义中定义,如果它们完全定义的话。
我错过了什么吗?
对我而言,它看起来像是一个编译器错误。 GCC和MSVC2008编译得很好。但是,我想知道他们是否真的会内联呼叫,或者只是在链接阶段丢弃两个符号中的一个。有趣的是,您可以注意到甚至没有调用此本地类成员函数。
我想知道MSVC2005是否有解决方法。我试图在MSDN上搜索这个典型问题但没有取得多大成功:我甚至无法找到编译器的已知错误列表。
附件:LNK2005.zip
答案 0 :(得分:3)
这是Visual Studio 2005中的一个错误,它在vs 2008中修复了
答案 1 :(得分:1)
对我来说这看起来像个错误。也许这就是它在VS2008中运行的原因。 (顺便说一句,Microsoft,这是打破Visual Studio中IDE /编译器依赖性的一个很好的理由。)
对于变通方法,请尝试明确添加inline
,或不内联wait_what
。