函数指针仅在main内部起作用?

时间:2019-05-27 13:26:05

标签: c++ function binary-search-tree function-pointers traversal

下面的代码显示了一个简单的插入到二进制搜索树(手写的NOT STL)中的过程,我在bst中使用了函数指针,并且希望从main外部遍历该树。我如何使它在main之外工作?

在tree.inorder()上出现错误,提示没有重载函数实例

处理程序类

#include <iostream>
using namespace std;

void printTree(int & a)
{
    cout << a << endl;
}

handler::handler()
{

}


void handler::printTree()
{   

    BinarySearchTree<int> tree;

    tree.insert(10);
    tree.insert(5);
    tree.insert(2);
    tree.insert(20);

    tree.inorder(printTree);
}

主班

#include <iostream>

#include "BinarySearchTree.h"
#include "handler.h"


int main()
{
    handler handle; 

    handle.printTree();
}
template<class T>
inline void BinarySearchTree<T>::inorder(Node * root, void(*inorderPtr)(T &)) const
{
    if (root != nullptr)
    {
        if (root->left != nullptr)
        {
            inorder(root->left, inorderPtr);
        }
        inorderPtr(root->data);
        if (root->right != nullptr)
        {
            inorder(root->right, inorderPtr);
        }
    }
    else
    {
        cout << "No data" << endl;
    }
}

template<class T>
inline void BinarySearchTree<T>::inorder(void(*inorderPtr)(T &)) const
{
    inorder(this->root, inorderPtr);
}

1 个答案:

答案 0 :(得分:2)

BinarySearchTree<T>::inorder被声明为const,因此root->dataconst,并且由于inorderPtr(root->data);(又名inorderPtr)而无法调用printTree(int&)需要一个非常量int&

通过修复const-correctness来修复它。您可以有两个BinarySearchTree<T>::inorder。一个const带一个void(*inorderPtr)(const T &),另一个非常量带一个void(*inorderPtr)(T &)