Вложенная структура: с недопустимым использованием нестатического члена при определении указателя структуры

Это демонстрация списка ссылок, я определил структуру Node и ее указатель в качестве заголовка, но компилятор сказал: in - допустимое использование нестатического члена на месте:

Node* head;

Дальше больше, если я не объявлю предварительно struct Node это сообщит необъявленный узел.

Код выглядит следующим образом:

#ifndef LINKLIST_H
#define LINKLIST_H

template<typename T>
class LinkList
{
    struct Node;        //why declaration is required here   ???

    public:
    //  member function
        Node* Find(T x);
    //.....

    private:
        struct Node
        {
            T data;
            Node* next;

         //   Node():next(NULL){}
            Node(const T& d=0, Node* n=NULL):data(d),next(n){}
        };

        Node* head;                //ERROR    ??????  why?
};

template<typename T>
typename LinkList<T>::Node* LinkList<T>::Find(T x)
{
    Node* ptr=head->next;   
   //.....

}

endif // LINKLIST_H

Ошибка выполнения:

||=== Build: Release in Broken Keyboard (compiler: GNU GCC Compiler) ===|
include\LinkList.h|41|error: invalid use of non-static data member 'LinkList<T>::head'|
include\LinkList.h|22|error: from this location|
include\LinkList.h|41|error: invalid use of non-static data member 'LinkList<T>::head'|
include\LinkList.h|95|error: from this location|
include\LinkList.h|95|error: default argument given for parameter 1 of 'void LinkList<T>::Insert(T, LinkList<T>::Node*)' [-fpermissive]|
include\LinkList.h|22|error: after previous specification in 'void LinkList<T>::Insert(T, LinkList<T>::Node*)' [-fpermissive]|
include\LinkList.h|95|error: default argument given for parameter 2 of 'void LinkList<T>::Insert(T, LinkList<T>::Node*)'|
include\LinkList.h|22|error: after previous specification in 'void LinkList<T>::Insert(T, LinkList<T>::Node*)'|
||=== Build failed: 8 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

1 ответ

Первое предварительное объявление struct Node является обязательным, поскольку вы используете его в методе Find, прежде чем предоставить определение Node. Но у вас не должно быть ошибки в Node *head. Я попробовал ваш код в Visual Studio 2015 и создать экземпляр шаблона в основном, ошибки нет.

Какая у вас версия компилятора?

Алон.

Другие вопросы по тегам