2013-03-18 4 views
2

ИСПРАВЛЕНО: был метод дважды в заголовочном файлеC++ не определен символ при компиляции

я получаю следующее сообщение об ошибке при попытке скомпилировать мой проект

% 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 

Релевантный код от tree.cc и 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 

Я получаю ощущение, что это что-то очень простое, но я не могу показаться, чтобы выяснить это.

+1

Почему inTree декларируется дважды в файле .h? : v (Один констент и один неконстантный) –

+0

Oh derp. lemme fix, что – LucienK

+0

Yup, это была ошибка. Огромное спасибо. Это то, что я получаю для копирования деклараций функций из одного файла в другой ... – LucienK

ответ

9

Сообщение, которое вы получаете на самом деле, связано с компоновщиком , а не с компилятором.

Одна из функций-членов, bool Tree::inTree(int index);, правильно объявлена ​​и определена как функция в const члена:

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

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

Однако в tree.h вы также определить это не- const перегрузки inTree():

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

Для определения не определено определение. Это то, о чем жалуется компоновщик.

+0

Я дважды его объявлял один раз (int k), один раз с (int). Спасибо за помощь. – LucienK

+1

@Dazedy: Проблема заключается не в **, что вы объявили ее дважды с разными именами аргументов. Имена аргументов не имеют значения. Проблема в том, что в одном случае вы использовали квалификатор 'const', а в другом - нет. –

+0

huh. поэтому без этой константы он просто перегрузится в зависимости от имени переменной, а не только от числа/типа параметров? – LucienK

6

Вот ваша ошибка:

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

в вашем .h вы определяете

bool inTree(int); 

Это разница!

Смежные вопросы