IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Undefined reference étrange


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Par défaut Undefined reference étrange
    Bien le bonjour,

    J'ai un petit pépin de référence indéfinie.
    J'ai 2 paires de fichiers que j'appellerai D et G (en .h et .cc à chaque fois pour bien séparer les déclarations du reste).

    Le fichier D.h définit une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static bool isEqual(const CDart*, const CDart*);
    Les objets CDart sont implémentés ailleurs et fonctionnent très bien. Sans surprise le but de cette fonction est de renvoie vrai si les 2 CDarts que l'on compare (via pointeurs) sont identiques.

    Dans le fichier G.cc j'ai une fonction qui va appeller celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool identique = CDart::isEqual(dartCourante.getBeta1(), bifaceCherchee[it2].getBeta1());
    Les fonctions getBeta1 et 2 renvoient des pointeurs vers des CDart.

    Le message d'erreur obtenu est le suivant :
    undefined reference to `Map2d::CDart::isEqual(Map2d::CDart const*, Map2d::CDart const*)'
    Or je ne comprend pas puisque c'est bel est bien la bonne fonction, avec le bon type de paramètre que l'on utilise. Quelqu'un aurait une idée ?
    Merci d'avance !

  2. #2
    Membre actif
    Profil pro
    Ingénieur
    Inscrit en
    Avril 2013
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Avril 2013
    Messages : 77
    Par défaut
    Ta fonction est définie dans le header. Plusieurs questions se posent:
    - as tu bien inclus le header dans le cpp?
    - as tu déclaré dans le header, la fonction en tant que membre d'une classe?
    Car pour une classe, une fonction membre statique est une fonction qui ne modifiera pas l'objet; mais hors d'une classe, une fonction statique n'est pas visible de l'extérieur.
    A priori, étant donné ton appel de fonction, ta fonction appartient à la classe statique CDart, donc doit être définie en tant que membre de cette classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class CDart
    {
        public:
            CDart();
            static bool isEqual(const CDart*, const CDart*);
    };

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Par défaut
    Merci de la réponse rapide.
    Pour répondre à tes questions :
    J'ai bien inclu dans G.cc (resp D.cc) les fichiers G.h (resp D.h).
    J'ai effectivement déclaré la fonction isEqual dans les méthodes publiques de CDart.

    J'ai essayé à tout hasard de faire sauter le 'static' de la définition et de l'implémentation de isEqual en me disant qu'après tout ce n'était pas dramatique si le code ne se rendait pas compte que rien n'était modifié. En faisant ça, j'ai l'erreur suivante :
    erreur: cannot call member function ‘bool Map2d::CDart::isEqual(const Map2d::CDart*, const Map2d::CDart*)’ without object
    J'ai donc abandonné cette voie pour retourner à quelque chose qui me semblait plus normal avec le static.

    je précise également que le fichier G.H inclu bien le fichier D.h et que j'arrive à naviguer dans la fonction isEqual en cliquant directement sur l'appel de fonction grace à mon IDE, ce qui pour moi veux dire que cette fonction était bien trouvée...

  4. #4
    Membre très actif
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Par défaut
    Petite parenthèse : donner des noms d'une seule lettre à tes fichiers n'est pas recommandé, mieux vaut donner des noms plus longs ayant un sens de façon à s'y retrouver... toi plus tard ou un autre mainteneur du code.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Par défaut
    Mes fichiers ont bel et bien des noms plus longs (en l'occurence dart.h et graphGrammar.h) mais je ne voulais pas rentrer trop dans le détail et embrouiller tout le monde. Néanmoins merci du conseil, ça ne fait jamais de mal d'en recevoir !

    Sinon j'ai toujours mon problème :
    undefined reference to 'Map2d::CDart::isEqual(Map2d::CDart const*, Map2d::CDart const*)'
    Quelqu'un aurait une idée ? Pour le prototype de isEqual et ses appels sont pour moi identiques, j'avoue être complètement perdu.

    Merci encore à tout ceux qui cherchent pour m'aider.

  6. #6
    Membre éclairé Avatar de GrosLapin
    Homme Profil pro
    Ingénieur et Etudiant
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur et Etudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Par défaut
    Salut,

    Est ce que tu pourrais mettre les grandes lignes de tes 4 fichiers ?

    Ça serais plus simple pour tenter de reproduire ton erreur

    Ps : Il y a pas de feinte de namespace dans tes fichiers ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. winsock.h : undefined reference...
    Par abraxas dans le forum Dev-C++
    Réponses: 14
    Dernier message: 06/08/2012, 13h42
  2. Undefined reference compilation réseau
    Par Ren97 dans le forum Dev-C++
    Réponses: 11
    Dernier message: 08/03/2005, 09h46
  3. Compilation de xmms : undefined reference to...
    Par Michaël dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 04/02/2005, 19h05
  4. undefined reference to `xmlParseFile'
    Par Clemaster dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 25/06/2004, 20h38
  5. g++ : undefined reference to ...
    Par le_barbu dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 14/05/2004, 07h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo