Указатель функции работает только внутри main? - PullRequest
0 голосов
/ 27 мая 2019

Код ниже показывает простую вставку в двоичное дерево поиска (рукописное НЕ STL). Я использовал указатели на функции в моем bst и хотел бы пройти по дереву вне 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 Ответ

2 голосов
/ 27 мая 2019

BinarySearchTree<T>::inorder объявлено const, следовательно, root->data равно const, и вы не можете позвонить inorderPtr(root->data);, потому что inorderPtr (он же printTree(int&)) ожидает неконстантного int&.

Исправьте это, исправив константность. Вы могли бы иметь два BinarySearchTree<T>::inorder. Один const получает void(*inorderPtr)(const T &), а другой неконстантный - void(*inorderPtr)(T &).

...