2013-03-18 111 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); 

这是有区别的!