Frage

Offenbar MSVC2005 versagt lokale Klassen Elementfunktionen, die führt zu LNK2005 Inline.

Ich bin vor diesem LNK2005 Fehler, wenn die folgende Zusammenstellung:

common.h Inhalt:

inline void wait_what()
{
  struct wtf
  {
    void ffffuuu() {}

  } local;
}

foo.cpp Inhalt:

#include "common.h"

void foo()
{
  wait_what();
}

bar.cpp Inhalt:

#include "common.h"

void bar()
{
  wait_what();
}

LNK2005.cpp Inhalt:

// forward declarations
void foo();
void bar();

int main()
{
  foo();
  bar();

  return 0;
}

Die Fehlermeldung lautet:

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

Über lokale Klassen, ISO IEC 14882-2003 sagt:

  

9.8 Lokale Klassendeklarationen

     

Eine Klasse kann innerhalb einer Funktionsdefinition definiert werden; eine solche Klasse ist ein local Klasse. Der Name einer lokalen Klasse ist zu seinem umschließenden Umfang lokal. Die lokale Klasse ist im Rahmen des umschließenden Umfang, und hat den gleichen Zugriff auf Namen außerhalb der Funktion als die einschließende Funktion tut. Erklärungen in einer lokalen Klasse verwenden können Namen nur geben, statische Variablen, extern Variablen und Funktionen, und Enumeratoren aus dem umgebenden Gültigkeitsbereich.

     

Eine umschließenden Funktion hat keinen besonderen Zugang zu Mitgliedern der lokalen Klasse; es folgt die üblichen Zugriffsregeln (Ziffer 11). Member-Funktionen einer lokalen Klasse werden innerhalb ihrer Klassendefinition definiert werden, wenn sie überhaupt definiert ist.

Habe ich etwas verpasst?

Für mich sieht es aus wie es ein Compiler Fehler ist. GCC und MSVC2008 kompilieren es einfach gut. Allerdings frage ich mich, ob sie wirklich den Anruf oder Verwerfungs eines der beiden Symbole während der Verbindungsphase Inline würde. Als interessante Note, können Sie feststellen, dass es auch kein Aufruf dieser lokalen Klasse Member-Funktion ist.

Ich frage mich, ob es eine Abhilfe für MSVC2005 ist. Ich habe versucht, MSDN für dieses typische Problem ohne viel Erfolg zu suchen. Ich eine Liste der bekannten Fehler zu finden, für den Compiler nicht einmal in der Lage war


Anhang: LNK2005.zip

War es hilfreich?

Lösung

es ein Fehler in Visual Studio 2005 ist, wurde festgelegt in vs 2008

Andere Tipps

Es sieht aus wie ein Bug zu mir. Vielleicht ist das, warum funktioniert es in VS2008. (Übrigens, Microsoft, ist dies ein guter Grund für das Brechen der IDE / Compiler Abhängigkeit in Visual Studio).

Wie für dieses Problem zu umgehen, versuchen Sie inline explizit hinzufügen, oder nicht inlining wait_what.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top