Pregunta

Al parecer, MSVC2005 no inline funciones miembro clases locales que conduce a LNK2005.

estoy frente a este error LNK2005 al compilar el siguiente:

common.h contenido:

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

  } local;
}

foo.cpp contenido:

#include "common.h"

void foo()
{
  wait_what();
}

bar.cpp contenido:

#include "common.h"

void bar()
{
  wait_what();
}

LNK2005.cpp contenido:

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

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

  return 0;
}

El mensaje de error es:

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

Acerca de las clases locales, ISO IEC 14882-2003 dice:

  

9.8 declaraciones de clase locales

     

Una clase se puede definir dentro de una definición de función; dicha clase se denomina locales clase. El nombre de una clase local es local a su alcance que encierra. La clase local está dentro del alcance del ámbito de inclusión, y tiene el mismo acceso a los nombres fuera de la función que hace la función de cerramiento. Declaraciones en una clase local sólo pueden utilizar nombres de tipos, las variables estáticas, variables y funciones extern, y enumeradores del ámbito que lo contiene.

     

Una función de cerramiento no tiene acceso especial a los miembros de la clase local; que obedece a las reglas de acceso habituales (cláusula 11). Las funciones miembro de una clase local se definirán dentro de su definición de clase, si se definen en absoluto.

¿Me he perdido algo?

Para mí, parece que es un error del compilador. CCG y MSVC2008 compilan, estuvo bien. Sin embargo, me pregunto si sería realmente inline la llamada o simplemente descartar una de las dos símbolos durante la fase de enlace. Como una nota interesante, se puede observar que incluso hay ninguna llamada a esta función miembro de la clase local.

Me pregunto si hay una solución para MSVC2005. Intenté buscar MSDN para este típico problema sin mucho éxito: ni siquiera era capaz de encontrar una lista de errores conocidos para el compilador

.

Datos adjuntos: LNK2005.zip

¿Fue útil?

Solución

que era un error en Visual Studio 2005, que se fijó en 2008 vs

Otros consejos

Parece que un error para mí. Tal vez por eso funciona en VS2008. (Por cierto, Microsoft, esta es una buena razón para romper la dependencia IDE / compilador en Visual Studio.)

En cuanto a la solución, intente añadir explícitamente inline, o no inlining wait_what.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top