错误:"<"令牌之前的预期非限定 ID(模板编译问题)

error: expected unqualified-id before '<' token (Template compilation issue)

本文关键字:ID 问题 编译 lt 令牌 错误      更新时间:2023-10-16

我正在尝试创建自己的模板化List类作为练习。我本应该从小开始的,但你来了。。我在每一行都得到错误"在'<'标记之前预期的不合格id",该行显示:

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

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