对二叉树类 C++ 函数的未定义引用

Posted

技术标签:

【中文标题】对二叉树类 C++ 函数的未定义引用【英文标题】:Undefined reference to function of binary tree class C++ 【发布时间】:2020-04-09 09:18:28 【问题描述】:

我收到以下错误:

 c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:\Users\Chris\AppData\Local\Temp\ccVDdszy.o:bt_test.cpp:(.text+0x4b7): undefined reference to `bt::insert(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2.exe: error: ld returned 1 exit status

在尝试编译我的 bt_test.cpp 以查看我的二叉树是否按我想要的方式工作时。我已经在同一个头文件中为我的二叉树类定义了所有函数,我已经看到很多其他人的问题是他们在头文件以外的文件中定义了他们的构造函数,该类是第一个已创建。

我似乎无法弄清楚为什么我的链接器无法引用我的构造函数,因为我最近还创建了一个队列类并实现了一个构造函数,就像我为二叉树所做的那样。下面是我关注的 bt_test.cpp 和 my_bt_not_a_template.h 文件。对于抛出此错误的原因,我们将不胜感激。

bt_test.cpp

#include <string>
#include <set>
#include <iostream>
#include "my_bt_not_a_template.h"

using namespace std;

int main()

    bt bt_1("t5");
    string lesse[5] = "NAND", "NOT", "NOT","NOT","NOT";
    int i = 0;
    while(!lesse[i].empty())
    
        bt_1.insert(lesse[i]);
    
    bt_1.printLevelOrder();

    return 0;

my_bt_not_a_template.h

#pragma once
#include <iostream>
#include <string>
#include <set>

using namespace std;

class bt

private:
    struct node
    
        string value;
        node* left;
        node* right;
    ;
    node *root;
    void printLevelOrder_DO(node* rooto);

public:
    bt(string val)
    
        root->value = val;
        root->left = NULL;
        root->right = NULL;
    
    void insert(string val);
    node *search(string val, node *leaf);
    bool isEmpty() const return root==NULL;
    void insert(string val, set<string> inputs);
    node* search(string val);
    void printLevelOrder() node* root; printLevelOrder_DO(root);
    void printLevel(node* root, int level);
    int height(node* node);
;
void bt::insert(string val, set<string> inputs)

    node* nod = new node;
    node* parent;
    nod->value = val;
    nod->left = NULL;
    nod->right = NULL;
    parent = NULL;

    node* current;
    current = root;
    while(current)
    
        parent = current;
        if(!(current->left && current->right))
        
            //If both left and right are NULL
            //enter value into left leaf
            if(inputs.count(current->value) != 0)
            
                //then is input and there should be no leafs containing anything below it
            
            else
            
                nod->left->value = val;
                nod->left->left = NULL;
                nod->left->right = NULL;
            
        
        else
        
            if(current->value == "NOT")
            
                nod->left->value = val;
                nod->left->left->left = NULL;
                nod->left->left->right = NULL;
            
            else
            
                nod->right->value = val;
                nod->right->left = NULL;
                nod->right->right = NULL;   
            
            
    

...other functions defined

编辑: 我意识到我有两个插入声明。

【问题讨论】:

您发布的代码中没有bt::insert 函数的定义。有一个声明,但没有定义。现在,也许您在此处省略的代码中有一个定义“...定义了其他函数”。但如果是这样,那么我们如何帮助您处理您省略的代码?如果您确实有尚未向我们展示的定义,请发布该定义。如果你不这样做,那么没有什么可解释的,你根本没有像链接器告诉你的那样定义bt::insert 顺便说一句,当你让事情正常运行时,你的 main 函数包含一个无限循环。 @john 哇,你说的很对。作为我的构造函数,我一直在阅读它。抱歉,我现在已经添加了插入函数的声明 好吧,缺少的insert 的定义是采用一个字符串参数的版本的定义。顺便说一句,除非您使用 inline 关键字,否则不应将类外方法定义放在头文件中。否则,如果您多次包含该头文件,您将面临 多个 定义的风险。但是这么大的函数不属于头文件,放在另一个cpp文件中。这是完全可能的,也是正确的做法,尽管许多新手在第一次尝试时都在苦苦挣扎。 【参考方案1】:

bt(string val);

你有一个额外的分号

【讨论】:

抱歉,我在上传的时候没有去掉那个。我已经在类之外重新定义了构造函数,以测试是否可以修复它并注释掉类中的定义。 (它没有解决它)

以上是关于对二叉树类 C++ 函数的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

二叉树类的实现

二叉树类问题框架

算法——二叉树类

数据结构二叉树

二叉树类高频算法题golang实现

二叉树类高频算法题golang实现