2013-03-18 6 views
2

FIXES: a la méthode deux fois dans le fichier d'en-têteC++ symbole non défini lors de la compilation

je reçois l'erreur suivante lorsque vous essayez de compiler mon projet

% make 
g++ -o p4 testTree.o tree.o node.o check.o 
Undefined      first referenced 
symbol        in file 
Tree::inTree(int)     tree.o 
ld: fatal: Symbol referencing errors. No output written to p4 
collect2: ld returned 1 exit status 
*** Error code 1 
make: Fatal error: Command failed for target `p4' 

Makefile

p4: testTree.o tree.o node.o check.o 
    g++ -o p4 testTree.o tree.o node.o check.o 
testTree.o: testTree.cc tree.h node.h check.h 
    g++ -c -Wall -Werror testTree.cc 

tree.o: tree.h tree.cc node.h check.h 
    g++ -c -Wall -Werror tree.cc 
node.o: node.h node.cc check.h 
    g++ -c -Wall -Werror node.cc 
check.o: check.h check.cc 
    g++ -c -Wall -Werror check.cc 
clean: 
    rm -f *~ *.o p4 

Le code pertinent de tree.cc et tree.h:

tree.cc

... 
bool Tree::inTree(int k) const 
{ 
    return locate(k,root) != NULL; 
} 
... 

tree.h

#ifndef TREE_H 
#define TREE_H 

#include "node.h" 
#include "check.h" 
using namespace std; 
class Tree 
{ 
    private: 
    Node *root; 
    public: 
    Tree(); 
    Tree(const Tree & t); 
    const Tree & operator=(const Tree &t); 
    friend ostream & operator<<(ostream &out, const Tree &t); 
    bool inTree(int k) const; 
    double & operator[](int k); 
    double & operator[](int k) const; 
    ~Tree(); 
    bool inTree(int index); 
    private: 
    Node * locate(int k, Node *rt) const; 
    ostream & display(ostream &out, Node *r, int dir=Node::L) const; 
    void add(int k, Node*&r); 
    void kill(Node *&rt); 
    void copy(Node *rt, Node *&newRt); 
}; 
#endif 

Je reçois le sentiment que c'est quelque chose semble très simple, mais je ne peux pas le comprendre.

+1

Pourquoi inTree est-il déclaré deux fois dans le fichier .h? : v (Un const et un non-const) –

+0

Oh derp. Lemme réparer que – LucienK

+0

Yup, c'était l'erreur. Merci beaucoup. C'est ce que je reçois pour copier des déclarations de fonction d'un fichier à un autre ... – LucienK

Répondre

9

Le message que vous obtenez provient en fait du linker , pas du compilateur.

Un de vos fonctions membres, bool Tree::inTree(int index);, est déclarée correctement et défini en fonction de membre const:

// Declaration in tree.h 
bool inTree(int index) const; 

// Definition in tree.cc 
bool Tree::inTree(int k) const 
//      ^^^^^ 

Cependant, tree.h vous définissez également cette surcharge non const de inTree():

// Declaration in tree.h, definition (supposedly) nowhere 
bool Tree::inTree(int k) 

Pour lesquels aucune définition n'est fournie. C'est ce sur quoi l'éditeur de liens se plaint.

+0

Je l'avais déclaré deux fois, une fois avec (int k), une fois avec (index int). Merci pour l'aide. – LucienK

+1

@Dazedy: Le problème est ** pas ** que vous l'avez déclaré deux fois avec des noms d'arguments différents. Les noms d'argument ne sont pas pertinents. Le problème est que dans un cas, vous avez utilisé le qualificatif 'const', et dans l'autre cas, vous ne l'avez pas fait. –

+0

huh. donc sans ce const, serait-il simplement surchargé en fonction du nom de la variable, plutôt que juste le nombre/type de paramètres? – LucienK

6

Voici votre erreur:

bool Tree::inTree(int k) const 
{ 
return locate(k,root) != NULL; 
} 

dans votre .h vous définissez

bool inTree(int); 

C'est une différence!

Questions connexes