Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    13

    c++ multiple declaration

    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

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Usa inline.
    codice:
    inline bool operator==(coordinate x, coordinate y) {
    return ((x.x1 == y.x1) && (x.x2 == y.x2) && (x.y1==y.y1) && (x.y2==y.y2)); };
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    13
    ciao, grazie per la risposta ma anche così non va...continua lo stesso errore
    ciao

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    62
    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.


  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    13
    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

  6. #6
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Ciao . . . Hai tolto la definizione di operator== nell' header???
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    13
    sisi
    ciao

  8. #8
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Strano . . . Potresti postare strutture.h e strutture.cpp ???
    Ps: togli l' ultimo ; in strutture.cpp . . .
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    13
    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

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    62
    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 :

    codice:
    #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!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.