ISO C++ запрещает объявление DNode без типа

Я пытаюсь создать файл шаблона для класса, который является узлом для двусвязного списка. Всякий раз, когда я пытаюсь скомпилировать, я сталкиваюсь с этой ошибкой.

ISO C++ запрещает декларацию «DNode» без типа

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

#ifndef DNODE_H
#define DNODE_H
#include <cstdlib>
#include <string>
#include <iostream>
#include <iterator>

template <class T>
class DNode
{
    public:
        DNode(T StartingData = T(), DNode* PrevLink = NULL, DNode* NextLink = NULL)
            {Data = StartingData; previous = PrevLink; next = NextLink;}

        void setData(T item)
            {Data = item;}

        void setNext(DNode *l)
            {next = l;}
        void setPrevious(DNode *l)
            {previous = l;}

        *DNode getPrevious() {return previous;}
        *DNode getNext() {return next;}

        T getData()
            {return Data;}

    private:
        DNode *previous, *next;
        T Data;
};

#endif

person Gregar543    schedule 21.03.2016    source источник
comment
Какого черта должно быть *DNode в *DNode getPrevious() ? Это не правильно.   -  person Captain Obvlious    schedule 21.03.2016


Ответы (1)


Это просто опечатка:

*DNode getPrevious() {return previous;}
*DNode getNext() {return next;}

должно быть:

DNode* getPrevious() {return previous;}
DNode* getNext() {return next;}

В остальном код выглядит нормально. Возможно, вам захочется поработать над стилем скобок, некоторые из ваших функций трудно читать, а ваш конструктор лучше использовать в качестве списка инициализаторов памяти. Также CapCase обычно используется только для имен классов, для переменных предпочтительнее camelCase (или snake_case, в зависимости от того, что). Поэтому я бы написал ваш конструктор таким образом:

DNode(T startingData = T(), DNode* prevLink = NULL, DNode* nextLink = NULL)
    : data(startingData)
    , previous(prevLink)
    , next(nextLink)
{ }
person Barry    schedule 21.03.2016
comment
Ничего себе, честно говоря, немного смущен, что я потратил столько времени на поиск чего-то такого маленького. Спасибо и за все дополнительные советы. Все еще учусь на первом курсе университета, и мне нужно избавиться от всех этих вредных привычек. - person Gregar543; 21.03.2016