对函数的未定义引用(在二进制搜索树中)C++

undefined reference to function (in binarysearch tree) c++

本文关键字:搜索树 二进制 C++ 函数 未定义 引用      更新时间:2023-10-16
//  Subsetted from:
//  Created by Frank M. Carrano and Tim Henry.
//  Copyright (c) 2013 __Pearson Education__. All rights reserved.
/** @file BinarySearchTree.cpp */
#include <iostream>
#include "BinarySearchTree.h"
// PRIVATE HELPER METHODS - IMPLEMENT THESE
template<typename ItemType, typename KeyType>
BinarySearchTree<ItemType, KeyType>::BinarySearchTree() : rootPtr(nullptr)
{
}
template<typename ItemType, typename KeyType>
BinarySearchTree<ItemType, KeyType>::~BinarySearchTree()
{
    if(rootPtr!=nullptr)
    {
        this->destroyTree(rootPtr); // Call inherited method
        rootPtr=nullptr;
    }
}  // end destructor
template<typename ItemType, typename KeyType>
void BinarySearchTree<ItemType, KeyType>::destroyTree(BinaryNode<ItemType>* subTreePtr)
{
    if(subTreePtr->getLeftChildPtr()!=nullptr)
    {
        destroyTree(subTreePtr->getLeftChildPtr());
    }
    if(subTreePtr->getRightChildPtr()!=nullptr)
    {
        destroyTree(subTreePtr->getRightChildPtr());
    }
    delete subTreePtr;
    subTreePtr=nullptr;
}
template<typename ItemType, typename KeyType>
BinaryNode<ItemType>* BinarySearchTree<ItemType,KeyType>::insertInorder(BinaryNode<ItemType>* subTreePtr, BinaryNode<ItemType>* newNode)
{
    BinaryNode<ItemType>* ptr=nullptr;
    if(subTreePtr==nullptr)
    {
        return newNode;
    }
    if(newNode->getItem() > subTreePtr->getItem())
    {
        ptr=insertInorder(subTreePtr->getRightChildPtr(), newNode);
        subTreePtr->setRightChildPtr(ptr);
    }
    else if(newNode->getItem() < subTreePtr->getItem())
    {
        ptr=insertInorder(subTreePtr->getLeftChildPtr(), newNode);
        subTreePtr->setLeftChildPtr(ptr);
    }
    return subTreePtr;
}
template<typename ItemType, typename KeyType>
BinaryNode<ItemType>* BinarySearchTree<ItemType, KeyType>::findNode(BinaryNode<ItemType>* subTreePtr, const KeyType& target) const
{
    if(subTreePtr=nullptr)
    {
        return subTreePtr;
    }
    else if(target>subTreePtr)
    {
        findNode(subTreePtr->getRightChildPtr(), target);
    }
    else if(target<subTreePtr)
    {
        findNode(subTreePtr->getLeftChildPtr(), target);
    }
    else
    {
        return subTreePtr;
    }
}

//////////////////////////////////////////////////////////////
//      PUBLIC METHODS BEGIN HERE
//////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////
//      Public BinaryTreeInterface Methods Section - IMPLEMENT THESE
//////////////////////////////////////////////////////////////
template<typename ItemType, typename KeyType>
bool BinarySearchTree<ItemType, KeyType>::add(const ItemType& newEntry)
{
    BinaryNode<ItemType>* ptr=new BinaryNode<ItemType>(newEntry);
    rootPtr=insertInorder(rootPtr, ptr);
    return false;
}
template<typename ItemType, typename KeyType>
ItemType BinarySearchTree<ItemType, KeyType>::getEntry(const KeyType& aKey) const throw(NotFoundException)
{
    return findNode()->getItem();
}
template<typename ItemType, typename KeyType>
bool BinarySearchTree<ItemType, KeyType>::contains(const KeyType& aKey) const
{
    if(findNode(rootPtr, aKey)==nullptr)
    {
        return false;
    }
    else
    {
        return true;
    }
}

//////////////////////////////////////////////////////////////
//      Public Traversals Section - IMPLEMENT THESE
//////////////////////////////////////////////////////////////
template<typename ItemType, typename KeyType>
void BinarySearchTree<ItemType, KeyType>::inorderTraverse(BinaryNode<ItemType>* subTreeptr)
{
    if(subTreeptr!=nullptr)
    {
        inorderTraverse(subTreeptr->getLeftChildPtr());
        print(subTreeptr);
        inorderTraverse(subTreeptr->getRightChildPtr());
    }
}
template<typename ItemType, typename KeyType>
void BinarySearchTree<ItemType, KeyType>::preorderTraverse(BinaryNode<ItemType>* subTreeptr)
{
    if(subTreeptr!=nullptr)
    {
        print(subTreeptr);
        preorderTraverse(subTreeptr->getLeftChildPtr());
        preorderTraverse(subTreeptr->getRightChildPtr());
    }
}
template<typename ItemType, typename KeyType>
void BinarySearchTree<ItemType, KeyType>::postorderTraverse(BinaryNode<ItemType>* subTreeptr)
{
    if(subTreeptr!=nullptr)
    {
        postorderTraverse(subTreeptr->getLeftChildPtr());
        postorderTraverse(subTreeptr->getRightChildPtr());
        print(subTreeptr);
    }
}
template<typename ItemType, typename KeyType>
void BinarySearchTree<ItemType, KeyType>::print(BinaryNode<ItemType>* subTreeptr)
{
    cout<<subTreeptr->getItem().getword()<<"  "<<subTreeptr->getItem().getdefn()<<endl;
}
template<typename ItemType, typename KeyType>
BinaryNode<ItemType>* BinarySearchTree<ItemType, KeyType>::getrootPtr()
{
    return rootPtr;
}
/*void testAdds(BinarySearchTree<DictionaryEntry, std::string> dictionary)
{
}
void testRemoves(BinarySearchTree<DictionaryEntry, std::string> dictionary)
{
}
void testWriteToFile(BinarySearchTree<DictionaryEntry, std::string> dictionary)
{
}*/

我一直在尝试解决此问题,但我不知道,请帮忙!!谢谢。我正在尝试做的是使用二叉搜索树的字典,错误是

Executive.o:在函数BinarySearchTree<DictionaryEntry, std::string>::inorderTraverse(BinaryNode<DictionaryEntry>*)': /home/chen/Desktop/Lab10/BinarySearchTree.cpp:132: undefined reference to BinarySearchTree::p rint(BinaryNode(' Executive.o:在函数BinarySearchTree<DictionaryEntry, std::string>::preorderTraverse(BinaryNode<DictionaryEntry>*)': /home/chen/Desktop/Lab10/BinarySearchTree.cpp:142: undefined reference to BinarySearchTree::p rint(BinaryNode(' Executive.o:在函数BinarySearchTree<DictionaryEntry, std::string>::postorderTraverse(BinaryNode<DictionaryEntry>*)': /home/chen/Desktop/Lab10/BinarySearchTree.cpp:155: undefined reference to BinarySearchTree::p rint(BinaryNode*(' collect2:错误:ld 返回 1 个退出状态 制造: *** [Lab10] 错误 1

请帮忙,非常感谢更新:即使我删除 print(( 方法,它也会产生完全相同的错误。因此,我们可以认为程序甚至无法在我的二进制搜索树类中找到我的"print(("方法,这真的很奇怪,我确实在我的头文件中声明了这个方法。

看看postorderTraverse的定义

template<typename ItemType, typename KeyType>
void BinarySearchTree<ItemType, KeyType>::postorderTraverse(BinaryNode<ItemType>* subTreeptr)

现在看看你对print的定义

template<typename ItemType, typename KeyType>
void print(BinaryNode<ItemType>* subTreeptr)

看到区别了吗?您在void之后但在print之前缺少BinarySearchTree<ItemType, KeyType>::