Как вернуть указатель на структуру шаблона? - PullRequest
0 голосов
/ 12 декабря 2018
#include <iostream>
using namespace std;


template<class T>
class LinkedList
{
public:
    struct Node {
        T data;
        Node* link;
    };
    struct Node* getNode();
    LinkedList();
    ~LinkedList();
private:
    Node* head;
};

template<class T>
struct Node* LinkedList<T>::getNode() // Error
{
    return head;
}

template<class T>
LinkedList<T>::LinkedList()
{
    head = NULL;
}

template<class T>
LinkedList<T>::~LinkedList()
{
}

Как видите, я хочу создать класс LinkedList, который может принимать данные любого типа.У меня проблемы с возвратом указателя на структуру шаблона.

Сообщение об ошибке: declaration is incompatible with... (функция объявлена)

1 Ответ

0 голосов
/ 12 декабря 2018

In

template<class T>
struct Node* LinkedList<T>::getNode() // Error
{
    return head;
}

Node имеет значение LinkedList<T>.Поскольку вы не находитесь в списке параметров функции или в теле функции, неквалифицированный Node недоступен для использования.Вы должны указать имя, используя LinkedList<T>::Node, чтобы сообщить компилятору, что вы используете LinkedList<T> Node.При этом вам также необходимо использовать ключевое слово typename, поскольку Node является зависимым именем.Это означает, что вам нужно:

template<class T>
typename LinkedList<T>::Node* LinkedList<T>::getNode()
{
    return head;
}

Или вы можете использовать конечный тип возврата и использовать

template<class T>
auto LinkedList<T>::getNode() -> Node*
{
    return head;
}

, чтобы сэкономить при вводе всего этого.


Также обратите внимание, что вам не нужно использовать struct, когда вы используете имя struct.Это требуется в C, но не требуется в C ++.

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