ошибка: ожидаемый неквалифицированный идентификатор перед маркером '<' (проблема компиляции шаблона) - PullRequest
0 голосов
/ 22 марта 2012

Я пытаюсь создать свой собственный шаблонный класс List в качестве тренировочного упражнения.Я, наверное, должен был начать с меньшего, но вот, пожалуйста. Я получаю сообщение об ошибке "ожидаемый безусловный идентификатор перед" <'токеном "в каждой строке, которая гласит: </strong>

typedef <typename ListType>

Я студент, и пару часов я читал о шаблонах, но до сих пор не могу разобраться с этим, любая помощь будет принята с благодарностью!

Мой hpp-файл для List:

#if !defined _LIST_HPP_
#define _LIST_HPP_

#include "Node.hpp"

///since we're creating a template everything must be defined in the hpp

typedef <typename ListType>
class List
{
   public:
      List();
      bool Empty();
      void PushFront();
      void PushBack();
      void PopBack();
      Node<ListType>& GetHead();

   private:
      int _size;
      Node<ListType>* _head;
      Node<ListType>* _tail;
};


///implement List class here
typedef <typename ListType>
List<ListType>::List() : _head(0), _tail(0), _size(0)
{
}
typedef <typename ListType>
bool <ListType>Empty()
{
   return !_size; //returns true if size = 0
}
typedef <typename ListType>
void List<ListType>::PushFront()
{
   _head = new Node<ListType>( _head , 0 );
   if (!Empty())
      _head->_prev->_next = _head; //set previous nodes _next to new _head

   ++_size;
}
typedef <typename ListType>
void List<ListType>::PushBack()
{
   _tail = new Node<ListType>( 0 , _tail);
   if (!Empty())
      _tail->_next->_prev = _tail; // set old tails _prev to new tail

   ++_size;
}
typedef <typename ListType>
void List<ListType>::PopBack()
{

}
typedef <typename ListType>
Node<ListType>& List<ListType>::GetHead()
{
   return _head;
}

#endif //define

И я также включу шаблонный класс узлов hpp, если это может быть что-то, что отбрасывает вещи?

#if !defined _NODE_HPP_
#define _NODE_HPP_


//#include "Sprite.hpp"

template<typename NodeType>
class Node{
   public:
      Node( Node* prev = 0, Node* next = 0);
      void SetData(NodeType newData);
      void GetData();
   private:
      friend class List;

      NodeType _data;
      Node* _next;
      Node* _prev;

};


///implement Node

template <typename NodeType>
Node<NodeType>::Node(Node* prev, Node* next) : _prev(prev), _next(next)
{}
template <typename NodeType>
void Node<NodeType>::SetData(NodeType newData)
{
   _data = newData;
}
template <typename NodeType>
void Node<NodeType>::GetData()
{
   return _data;
}

#endif //define

1 Ответ

5 голосов
/ 22 марта 2012

Это template, а не typedef.

И пока мы это делаем, ваши токены препроцессора являются недействительными идентификаторами, поскольку они начинаются со знака подчеркивания, что здесь запрещено. Вместо этого используйте что-то вроде LIST_HPP.

Наконец, давайте посмотрим на ваше Empty определение:

typedef <typename ListType>
bool <ListType>Empty()
{
   return !_size; //returns true if size = 0
}

Прежде всего, в названии метода отсутствует имя класса. Во-вторых, мне не нравится преобразование числа в bool. Почему бы не использовать явное сравнение? Это также устраняет комментарий, который сам по себе бесполезен, поскольку он просто перефразирует код.

Это оставляет нас с:

template <typename ListType>
bool List<ListType>::Empty()
{
    return _size != 0;
}
...