错误:'<'之前的预期unqualified-id令牌(模板编译问题)

时间:2012-03-22 14:18:04

标签: c++ templates compilation compiler-errors

我正在尝试创建自己的模板化List类作为练习练习。我应该可能已经开始变小但你去了......我收到错误“预期不合格的身份'之前'<'令牌“在每行显示:

typedef <typename ListType>

我是一名学生,我已经阅读了几个小时的模板,但仍然无法想象这一个,任何帮助都会非常感激!

我的列表的hpp文件:

#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 个答案:

答案 0 :(得分:5)

它是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;
}