C++编译时出现未定义符号错误

11

修复:在头文件中方法出现了两次

当我尝试编译我的项目时,出现了以下错误

% 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
为什么在.h文件中inTree被声明了两次?(一个是const,一个是非const) - user123
哦,笨蛋。让我来修复它。 - LucienK
是的,那就是错误所在。非常感谢。这就是我从一个文件复制函数声明的后果... - LucienK
总是发生的事情,只不过在我的情况下,通常是整个课程 :p - user123
2个回答

15

你收到的信息实际上来自于连接器,而不是编译器。

你的一个成员函数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)

这是链接器抱怨的原因:没有提供定义


我声明了两次,一次是用(int k),一次是用(int index)。感谢您的帮助。 - LucienK
1
@Dazedy:问题不在于你用不同的参数名称声明了两次。参数名称是无关紧要的。问题在于你在一个情况下使用了const限定符,而在另一个情况下没有使用。 - Andy Prowl
没有那个const,它会根据变量名而不是参数的数量/类型来重载吗? - LucienK
@Dazedy:不,你会有两个完全相同的成员函数声明 - 编译器会拒绝它。参数名称是无关紧要的,只有参数类型决定了函数的签名。 - Andy Prowl

7

这是您的错误:

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

在你的.h文件中定义了以下内容。
bool inTree(int);

这是一个区别!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接