2013-03-18 104 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 (一個const和一個非const) – 2013-03-18 21:00:39

+0

Oh derp。 lemme修復 – LucienK 2013-03-18 21:01:06

+0

是的,那是錯誤。謝謝一堆。這就是我從一個文件複製函數聲明到另一個... – LucienK 2013-03-18 21:03:15

回答

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 2013-03-18 21:05:12

+1

@Dazedy:問題是**不是**,你用不同的參數名稱聲明瞭它兩次。參數名稱無關緊要。問題在於,在一種情況下,你使用了'const'限定符,而在另一種情況下你沒有。 – 2013-03-18 21:06:10

+0

呵呵。所以如果沒有這個常量,它會根據變量名稱而超載,而不僅僅是參數的數量/類型? – LucienK 2013-03-18 21:13:49

6

這是你的錯誤:

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

.h定義

bool inTree(int); 

這是有區別的!