显然,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 局部类声明

类可以在函数定义中定义;这样的类称为 当地的 班级。本地类的名​​称是其封闭范围的本地名称。本地类位于封闭作用域的范围内,并且与封闭函数具有相同的对函数外部名称的访问权限。局部类中的声明只能使用封闭范围中的类型名称、静态变量、外部变量和函数以及枚举器。

封闭函数对本地类的成员没有特殊访问权限;它遵守通常的访问规则(第 11 条)。本地类的成员函数应在其类定义中定义(如果已定义)。

我错过了什么?

对我来说,这看起来像是一个编译器错误。GCC 和 MSVC2008 编译它就可以了。但是,我想知道他们是否真的会内联调用,或者只是在链接阶段丢弃两个符号之一。有趣的是,您可以注意到甚至没有调用这个本地类成员函数。

我想知道 MSVC2005 是否有解决方法。我尝试在 MSDN 上搜索这个典型问题,但没有成功:我什至无法找到编译器的已知错误列表。


依恋: LNK2005.zip

有帮助吗?

解决方案

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

其他提示

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

至于解决方法,请尝试显式添加 inline, ,或者不内联 wait_what.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top