c++ - and - Error de redefinición múltiple
class h and class cpp (5)
- Reconstruir todo
- Busque Piece :: Piece y elimine todos los archivos de encabezado 2b. Nunca #include archivos .cpp
- Busque #define que se resuelve en Pieza
Después de aprender más sobre clases y punteros, rediseñé un programa que tenía y eliminé 200 líneas de código, en el proceso creando otras dos clases, Location
y Piece
. El problema es que, después de obtener todo para compilar, el enlazador se queja de que el constructor de Piece
se define varias veces, con una carga de errores:
In function ''Piece'': board.o
multiple definition of ''Piece::Piece(int)` char_traits.h
In function ''Piece'': board.o
multiple definition of ''Piece::Piece(int)` piece.cpp
In function ''Piece'': player.o
multiple definition of ''Piece::Piece(int)` piece.cpp
In function ''Piece'': player.o
multiple definition of ''Piece::Piece(int)` piece.cpp (yes, same exact error!)
In function ''Piece'': refereee.o
multiple definition of ''Piece::Piece(int)` char_traits.h
In function ''Piece'': referee.o
multiple definition of ''Piece::Piece(int)` piece.cpp
...
Cuando hago clic en el error de char_traits.h
, me lleva a esto:
static size_t
length(const char_type* __s) //error points here to line 262
{ return __builtin_strlen(__s); }
Otro char_traits.h
me lleva a
static int
compare(const char_type* __s1, const char_type* __s2, size_t __n) //line 258, error points here too
{ return __builtin_memcmp(__s1, __s2, __n); }
Y para que lo sepas, location.h es lo único que incluye piece.h (bueno, otros archivos incluyen piece.h indirectamente de location including piece.h), board.h es lo único que incluye location.h, y un montón de clases incluyen board.h
Traté de cambiar el protector de encabezado a _OTHELLO_PIECE_H
, e intenté cambiar el nombre de la clase a OPiece (a través del IDE). Ninguno de los dos solucionó el problema.
Lo curioso es que uno de los errores tiene una ''función'' OPiece '': ", y luego mi IDE pone chatter.o
, aunque ni chatter.h ni chatter.cpp incluyen nada que incluya OPiece.
¿Alguna idea de lo que podría estar causando este error de redefinición?
Deberías poner la implementación del constructor en piece.cpp
, no directamente en piece.h
.
La causa más común de un error de definición de función múltiple es poner una definición de función en un archivo de encabezado y olvidarse de hacerlo en inline
.
No me preocuparía demasiado por char_traits.h
, esto probablemente significa que debido a un patrón de plantilla, el enlazador no pudo encontrar un mejor lugar para reclamar la definición que ocurrió en ese archivo de objeto en particular.
Solo una suposición: ¿ #include
o #import
por accidente? Lo que me pasó una vez :-)
hay dos lugares para implementar Piece::Piece(int)
en una compilación típica:
1) la interfaz (en la declaración)
class Piece {
int d_a;
public:
Piece(int a) : d_a(a) {
}
/* ... */
};
2) en un archivo cpp dedicado
en Piece.hpp
class Piece {
int d_a;
public:
Piece(int a);
/* ... */
};
en Piece.cpp
Piece::Piece(int a) : d_a(a) {
}
sin embargo, las plantillas se definen de manera diferente.
el error a menudo indica que Piece::Piece(int a) : d_a(a) {}
se incluye en varios archivos cpp.
cada archivo de objeto producido agrega el símbolo Piece::Piece(int)
donde es visible.
al final de la creación, todos los objetos se fusionan / vinculan para crear su binario o ejecutable final. entonces el enlazador ve que hay copias de esta definición y produce un error.
Una manera rápida de diagnosticar esto es (suponiendo que sus compilaciones no demoren):
#warning Piece::Piece(int) is visible here
Piece::Piece(int a) : d_a(a) {
}
exactamente una advertencia debe ser emitida. si se emiten más, entonces el compilador probablemente proporcionará un poco de información (como el orden de inclusión).