Локальные классы внутри встроенной функции, не являющейся членом, создают LNK2005 с помощью MSVC2005

StackOverflow https://stackoverflow.com/questions/2078087

Вопрос

По-видимому, 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 Объявления локальных классов

Класс может быть определен в определении функции;такой класс называется a Местные новости класс.Имя локального класса является локальным по отношению к окружающей его области.Локальный класс находится в области охватывающей области и имеет тот же доступ к именам вне функции, что и охватывающая функция.Объявления в локальном классе могут использовать только имена типов, статические переменные, внешние переменные и функции, а также перечислители из охватывающей области.

Заключающая функция не имеет специального доступа к членам локального класса;он подчиняется обычным правилам доступа (пункт 11).Функции-члены локального класса должны быть определены в пределах их определения класса, если они вообще определены.

Я что-то пропустил?

На мой взгляд, похоже, что это ошибка компилятора.GCC и MSVC2008 компилируют его просто отлично.Однако мне интересно, действительно ли они встроят вызов или просто отбросят один из двух символов на этапе соединения.В качестве интересного примечания вы можете заметить, что даже нет вызова этой локальной функции-члена класса.

Интересно, существует ли обходной путь для MSVC2005.Я попытался найти в MSDN эту типичную проблему, но без особого успеха:Я даже не смог найти список известных ошибок для компилятора.


Привязанность: LNK2005.zip

Это было полезно?

Решение

это была ошибка в Visual Studio 2005, она была исправлена в версии 2008

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top