Domanda

A quanto pare, non riesce a MSVC2005 inline funzioni membro classi locali che porta ad LNK2005.

sto affrontando questo errore LNK2005 quando si compila il seguente:

contenuto common.h:

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

  } local;
}

contenuto foo.cpp:

#include "common.h"

void foo()
{
  wait_what();
}

contenuto bar.cpp:

#include "common.h"

void bar()
{
  wait_what();
}

contenuto LNK2005.cpp:

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

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

  return 0;
}

Il messaggio di errore è:

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

A proposito di classi locali, ISO IEC 14882-2003 dice:

  

dichiarazioni 9.8 classe locale

     

Una classe può essere definita all'interno di una definizione di funzione; una classe è chiamato locale di classe. Il nome di una classe locale è locale per il campo di applicazione racchiude. La classe locale è nell'ambito della portata racchiude, e ha lo stesso accesso ai nomi all'esterno della funzione come fa la funzione racchiude. Le dichiarazioni in una classe locale può utilizzare nomi unico tipo, variabili statiche, variabili e funzioni esterno, e enumeratori dal campo di applicazione racchiude.

     

Una funzione racchiude non ha accesso speciale membri della classe locale; obbedisce alle regole di accesso abituali (clausola 11). funzioni membro di una classe locale sono definite all'interno della loro definizione della classe, se sono definiti a tutti.

Mi sono perso qualcosa?

A me, sembra che si tratta di un bug del compilatore. GCC e MSVC2008 compilano proprio bene. Tuttavia, mi chiedo se avrebbero realmente inline la chiamata o semplicemente scartare una delle due simboli durante la fase di collegamento. Come nota interessante, si può notare che non v'è ancora alcuna chiamata a questa funzione di membro di classe locale.

Mi chiedo se esiste una soluzione per MSVC2005. Ho provato a cercare MSDN per questo problema tipico senza molto successo: non ero nemmeno in grado di trovare un elenco di bug noti per il compilatore

.

Allegato: LNK2005.zip

È stato utile?

Soluzione

è stato un bug in Visual Studio 2005, è stato fissato in VS 2008

Altri suggerimenti

Si presenta come un insetto per me. Forse è per questo che funziona in VS2008. (Per inciso, Microsoft, questo è un buon motivo per rompere la dipendenza IDE / compilatore in Visual Studio.)

Per quanto riguarda una soluzione, provare esplicitamente aggiungendo inline, o no inlining wait_what.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top