内联非成员函数内的本地类生成带有MSVC2005的LNK2005

时间:2010-01-16 16:30:54

标签: c++ visual-c++-2005 inlining local-class lnk2005

显然,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

2 个答案:

答案 0 :(得分:3)

这是Visual Studio 2005中的一个错误,它在vs 2008中修复了

答案 1 :(得分:1)

对我来说这看起来像个错误。也许这就是它在VS2008中运行的原因。 (顺便说一句,Microsoft,这是打破Visual Studio中IDE /编译器依赖性的一个很好的理由。)

对于变通方法,请尝试明确添加inline,或不内联wait_what