Передача указателя функции в шаблонный класс - PullRequest
0 голосов
/ 15 октября 2019

Мой вопрос довольно прост ... У меня есть двоичное дерево поиска, которое шаблонизировано. Мне нужно, чтобы пользователь мог передать функцию сравнения при вызове конструктора. Мой код продолжал кричать на меня, пока я не шаблонизировал пользовательскую функцию (в программе драйвера). Это сломало мою интуицию о том, как работает шаблонирование. Это заставляет меня задуматься, не является ли мой код шаблонным, как я ожидаю. Мне просто любопытно, нормально ли иметь пользовательский шаблон для своих функций при объявлении объекта класса, который является шаблонным (особенно, когда этот объект требует передачи определенной пользователем функции). Если это не нормально, то я знаю, что у меня что-то не так с моим кодом. enter image description here

Это ошибка, которую я получал раньше. Эти "необъявленные идентификаторы" просто являются результатом одной ошибки в строке 93. Именно здесь я пытаюсь создать экземпляр класса.

//Part of driver program. 
//Not sure why code doesn't work without template <typename T> 

template <typename T>
int compare(const int data, const int nodeData) 
//User defined compare function. Takes two values and compares them and returns a -1, 0, or 1 if it is less than equal to or greater than respectively. 
{
    int returnValue; //The value that will be returned. 
    if (data < nodeData)
    {
        returnValue = -1;
    }
    else if (data > nodeData)
    {
        returnValue = 1;
    }
    else
    {
        returnValue = 0;
    }
    return(returnValue);
}
//Now for the code that is inside my class. 
//The following is my decoration for the function pointer within my class.
//////////////
int (*funcCompare)(T i, T j); 
////////////////

//And lastly here is my constructor for my class 
    SplayTree(int(*compFunction)(const T, const T)) //Constructor that takes a pointer to a comparison function as an arugment. 
    {
        funcCompare = compFunction;
    };

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Я считаю, что отчасти проблема в том, что ваши аргументы являются целыми числами, когда кажется, что они должны быть T, чтобы соответствовать пользовательскому типу. Предполагая, что они будут int, это хорошо для тестирования, но не будет работать, если требуется любой другой тип данных. Если это так, то имеет смысл использовать его как шаблон, поскольку функция эффективно переносится в ваш заголовочный файл, который выглядит как шаблон. Конечно, я относительно новичок в этом, поэтому, если я допустил логическую ошибку, пожалуйста, дайте мне знать!

0 голосов
/ 15 октября 2019

Я думаю, что ваша проблема заключается в инициализации myTree. Я написал код, который, как мне кажется, имитирует ваш вариант использования. Я верю, что именно последняя строка будет решением вашей проблемы:

    //header file
    template <typename T>
    class TemplatedClass {
    public:
        TemplatedClass(int(*compFunction)(const T, const T)) :
            funcCompare(compFunction)
        {}
    private:
        int (*funcCompare)(const T i, const T j);
    };
    /////////////////////////////////////////////////////////////
    //compare function
    int compare(const int data, const int nodeData)
    {
        int returnValue; 
        if (data < nodeData)
        {
            returnValue = -1;
        }
        else if (data > nodeData)
        {
            returnValue = 1;
        }
        else
        {
            returnValue = 0;
        }
        return(returnValue);
    }
    //////////////////////////////////////////////////////////////
    //initialization
    TemplatedClass<int> tc(compare);

Надеюсь, это поможет. Пожалуйста, дайте мне знать, если я неправильно понял ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...