Error de vinculación 2005 Visual Studio 2008 C ++

Tenía struct errorStruct y una definición de cola errQueue en yacc.y, luego lo moví a un archivo .h separado
¡pero me da un error de vinculación que la definición se encuentra tanto en yacc.obj como en node.obj!
Intenté crear una nueva solución pero aún da el mismo error

Error   9   error LNK2005: "class std::queue<struct errorStruct,class std::deque<struct          

errorStruct,class std::allocator<struct errorStruct> > > errQueue" (?errQueue@@3V?$queue@UerrorStruct@@V?

$deque@UerrorStruct@@V?$allocator@UerrorStruct@@@std@@@std@@@std@@A) already defined in Node.obj    yacc.obj

actualización

primero :
Node.h // para la clase de nodo
yacc.y // reglas + errorStruct + cola errQueue + clase ErrList: incluye "Node.h" y <cola>

entonces:

Node.h // para clase de nodo + errorStruct + cola errQueue + clase ErrList: incluye <cola>
yacc.y // reglas: incluye "Node.h"

actualización

en Node.h

struct errorStruct{
            int errLineNum;
            int errColNum ;
            char * errMessage;
    };

class ErrList{

public:
void pushError(int line,int col,char * message);
void popError();    
void printErrors();
int getSize();

private :
queue <errorStruct> errQueue;

};
externErrList * se = new ErrList ();

el resto de Node.h no tiene nada que ver con esta clase
en yacc.y solo usando
se->pushError(...);
y como ninguna declaración de clase ErrList o errQueue

preguntado el 16 de mayo de 11 a las 16:05

Una sugerencia: SO tiene una comunidad muy útil, pero necesita ayudar a que la comunidad le ayude publicando toda la información relevante en forma de un ejemplo de código minimalista. Al hacerlo, la mayoría de las veces te darás cuenta de cuál es el error y aprenderás mucho de él, si no, ayuda a los que están aquí para ayudarte mejor. Publicar información inadecuada hace que la Q entre en un bucle pidiendo más información y solo retrasa todo el proceso, lo que no es bueno para usted ni para nosotros. -

sí, todavía estoy aprendiendo que intentaré hacerlo mejor ... gracias -

No seas vago, sé un as; escribe un apropiado ¡caso de prueba! -

¿Puedo agregar esta página también? ;) catb.org/~esr/faqs/smart-questions.html -

2 Respuestas

Creo que deberías organizar el código como:

yacc.h   //-----> should have declaration of errQueue & errorStruct

yacc.cc  //-----> should include yacc.h, 
//It can create variables of type errQueue & errorStruct

node.cc  //-----> should include yacc.h
//It can create variables of type errQueue & errorStruct

Tenga en cuenta que las declaraciones solo deben estar presentes en yacc.h y debe incluirse en todos sus archivos cc que necesitan crear instancias de dichos tipos, si las estructuras se declaran en cualquiera de sus archivos cc además del encabezado (yacc.h), terminará obteniendo los errores de redefinición tu mencionas.

contestado el 16 de mayo de 11 a las 20:05

no, en realidad, va exactamente al revés: tengo la declaración en Node.hy yacc.y incluye node.h .. No puedo controlar yacc.cpp porque uso bison para lidiar con eso - Katia

@Katia: ¿podrías publicar la organización de tu código fuente tal como mencioné en mi respuesta? Le ayudará a comprender mejor su problema. - Alok Save

@Katia: Necesito ver cómo ha declarado sus variables, especialmente errQueue, ¿Puede mostrarnos partes del código donde ha utilizado errQueue? - Alok Save

en Node.h struct errorStruct {.....}; cola errQueue; incluso y usando el espacio de nombres std; - Katia

opss! Olvidé publicar la respuesta ... lo siento ...

lo obtuve con la ayuda de la referencia de @Peter K.:

vaya a VS: proyecto -> página de propiedades -> propiedades de configuración -> enlazador -> línea de comandos

y añade /FORCE:MULTIPLE en el cuadro de opciones adicionales

contestado el 17 de mayo de 11 a las 12:05

Forzar el proceso de vinculación no es la solución. Necesita reorganizar su fuente para que no tenga el error en su lugar. - Wilx

@wilx Sé que solo está ignorando el error y no lo está resolviendo, pero al menos puedo seguir trabajando mientras descubro cómo resolverlo. congelar todo el proyecto tampoco es bueno ... ¿no crees? - Katia

No estoy de acuerdo. Lo estas haciendo mal. Resuélvalo ahora. Si no comprende el problema ahora, ¿cómo sabe que no introducirá más de lo mismo durante el tiempo que lo esté ignorando? ODR es uno de los fundamentos de C ++. - Wilx

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.