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

Hol*_*lly 0 c++ templates compiler-errors compilation

我正在尝试创建自己的模板化List类作为练习练习.我应该可能已经开始变小了但是你去了......我得到的错误是"在''''''''''''''''''''''''''''''''''''''''''

typedef <typename ListType>
Run Code Online (Sandbox Code Playgroud)

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

我的列表的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
Run Code Online (Sandbox Code Playgroud)

而且我还会包含模板化的节点类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
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 5

template,不是typedef.

虽然我们在它,但是你的预处理器令牌是无效的标识符,因为它们以下划线开头,这里不允许这样做.使用类似的东西LIST_HPP.

最后,我们来看看你的Empty定义:

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

首先,这缺少方法名称中的类名.其次,我不喜欢从数字到数字的转换bool.为什么不使用明确的比较?这也消除了评论,这本身没有用,因为它只是解释了代码.

这让我们:

template <typename ListType>
bool List<ListType>::Empty()
{
    return _size != 0;
}
Run Code Online (Sandbox Code Playgroud)