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