classi locali all'interno funzione inline terzo produce LNK2005 con MSVC2005
-
21-09-2019 - |
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
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
.