我正在尝试创建自己的模板化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
答案 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;
}