Локальные классы внутри встроенной функции, не являющейся членом, создают LNK2005 с MSVC2005 - PullRequest
2 голосов
/ 16 января 2010

Очевидно, что 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 content:

// 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

Ответы [ 2 ]

3 голосов
/ 16 января 2010

это была ошибка в visual studio 2005, исправлена ​​в vs 2008

1 голос
/ 16 января 2010

Это похоже на ошибку для меня. Может быть, поэтому он работает в VS2008. (Кстати, Microsoft, это хорошая причина для нарушения зависимости IDE / компилятора в Visual Studio.)

Что касается обходного пути, попробуйте явно добавить inline или не вставлять wait_what.

...