PDA

Visualizza la versione completa : c++ multiple declaration


steros84
17-04-2009, 10:25
Salve ragazzi, sto facendo un programmino ad oggetti ( l ho fatto senza oggetti e funziona bene ora mi hanno detto di farci una classe...). ed il problema qui:
Dichiaro in un file stutture.h quello che mi serve e faccio l'overloading di operator== come segue:
#ifndef strutture_h
#define strutture_h
#include "cv.h" \\ una libreria di openCV
using namespace std;
struct statistica{
CvMat* media;
CvMat* deviazione;
};
struct coordinate{
int x1;
int x2;
int y1;
int y2;
bool used;
int dim;
};

bool operator==(coordinate x, coordinate y) {
return ((x.x1 == y.x1) && (x.x2 == y.x2) && (x.y1==y.y1) && (x.y2==y.y2)); };
#endif

poi mi faccio una classe dove in un metodo uso una funzione che usa l operatore== tra due elementi di tipo coordinate, in particolare ho dovuto ridefinire l'operatore per usare "find" delle stl vector.
L'errore del linker :
multiple definition of `operator==(coordinate, coordinate)'
first defined here
ld returned 1 exit status
C:\Documents and Settings\steros84\... [Build Error] [alg_xin_he.exe] Error 1

spero di essere stato "comprensibile" cmq per qualsiasi cosa vi chiarisco il problema.
grazie infinite
stefano

shodan
17-04-2009, 11:34
Usa inline.


inline bool operator==(coordinate x, coordinate y) {
return ((x.x1 == y.x1) && (x.x2 == y.x2) && (x.y1==y.y1) && (x.y2==y.y2)); };

steros84
17-04-2009, 21:13
ciao, grazie per la risposta ma anche cos non va...continua lo stesso errore
ciao

mico90
18-04-2009, 07:33
Ciao,
prova a togliere la definizione dell' operatore dal file header e mettila invece in un file .cpp;
ovviamente nel file .cpp devi includere l' header della classe.

PS: la definizione di variabili o funzioni in un file header ( a meno che non si tratti di un template ) e' scoraggiata ed e' da evitare per un semplice motivo : in un programma ci possono essere infinite dichiarazioni di un nome, ma una e una sola definizione; se metti una definizione nel file header rischi di ridefinire il nome in diverse unita' di compilazione, con conseguente errore del linker.

:ciauz:

steros84
18-04-2009, 10:02
ciao mico90,
ho creato un file strutture.cpp come segue (se ci sono errori segnala):
#include "strutture.h"
bool operator==(coordinate x, coordinate y) {
return ((x.x1 == y.x1) && (x.x2 == y.x2) && (x.y1==y.y1) && (x.y2==y.y2)); };
adesso non ho errore del linker ma il compilatore mi dice:

1) C:\Documents and Settings\steros84... \strutture.cpp In function `bool operator== (coordinate, coordinate)'

2)redefinition of `bool operator==(coordinate, coordinate)'

3)C:\Documents and Settings\steros84...strutture.h `bool operator==(coordinate, coordinate)' previously defined here


boooh
attendo vostre segnalazioni,
ciao e grazie

KrOW
18-04-2009, 10:22
Ciao . . . Hai tolto la definizione di operator== nell' header???

steros84
18-04-2009, 10:30
sisi
ciao

KrOW
18-04-2009, 10:47
Strano . . . Potresti postare strutture.h e strutture.cpp ???
Ps: togli l' ultimo ; in strutture.cpp . . .

steros84
18-04-2009, 11:57
Ragazzi vi chiedo scusa ma l'errore che ho postato prima (del compilatore) era errato!!!
L'errore quello del linker che ho postato all'inizio "multiple definition..." e persisiste!
Le modifiche apportate su vostro consiglio mi hanno portato a fare questo (anche se nn funzionante):
strutture.h

#ifndef strutture_h
#define strutture_h
#include "cv.h"
using namespace std;
struct statistica{
CvMat* media;
CvMat* deviazione;
};
struct coordinate{
int x1;
int x2;
int y1;
int y2;
bool used;
int dim;
};
#endif

mentre strutture.cpp

#include "strutture.h"
bool operator==(coordinate x, coordinate y) {
return ((x.x1 == y.x1) && (x.x2 == y.x2) && (x.y1==y.y1) && (x.y2==y.y2)); };
Ascoltate: se non faccio la classe tutto funziona, ora che lo sto facendo con una classe ho problemi sull'operatore...questo pu aiutarvi!?
ciao e grazie
a presto

mico90
18-04-2009, 13:27
Ciao,
possibile che il tuo compilatore generi un operator==() di default ? non saprei a cosa altro pensare !
Prova a definire operator==() come membro della classe, quindi con un solo argomento dato che l' altro e' implicito :



#ifndef strutture_h
#define strutture_h
#include "cv.h"
using namespace std;
struct statistica{
CvMat* media;
CvMat* deviazione;
};
struct coordinate{
int x1;
int x2;
int y1;
int y2;
bool used;
int dim;
bool operator==(const coordinate& y) {
return ((x1 == y.x1) && (x2 == y.x2) && (y1==y.y1) && (y2==y.y2)); };
};
#endif


PS: ovviamente ora l' implementazione sta nel file .h, ma essendo implicitamente inline non reca problemi di doppie definizioni ( e non serve nemmeno l' implementazione nel file .cpp )

spero sia di aiuto! :ciauz:

Loading