我正在尝试创建一个封装MinPriorityQueue和MaxPriorityQueue的接口。两者都有一个迭代器和const_iterator(这就是为什么我需要一个自己的优先级队列,而不是在不允许迭代访问的标准库中)。
template <typename T> class PriorityQueueInterface
{
public:
typename ArrayList<T>::iterator iterator;
typename ArrayList<T>::const_iterator const_iterator;
virtual void insert( T item ) = 0;
virtual bool get( T key, T& value ) const = 0;
virtual T front() const = 0;
virtual T back() const = 0;
virtual ~PriorityQueueInterface() {}
};
ArrayList是我自己创造的。
这给出了一个错误:
错误1错误C2143:语法错误:缺少';'在'&lt;'之前
我不明白,因为如果我没有定义那些类型名称,它就有效。如果类不是抽象的,则类型名称可以工作,但我希望接口包含这些迭代器。
编辑:好的,我认为我发现了问题,它与此代码无关。我重新创建了原帖,我希望有人会发现它很有用。
答案 0 :(得分:5)
您需要typedef
而不是typename
来创建类型别名。而且你还需要typename
,因为它是一个依赖类型:
typedef typename ArrayList<T>::iterator iterator;
^^^^^^^
您的代码声明iterator
和const_iterator
是数据成员,而不是类型。
答案 1 :(得分:2)
您应该使用typedef typename
构造:
template <typename T> class PriorityQueueInterface
{
public:
typedef typename ArrayList<T>::iterator iterator;
typedef typename ArrayList<T>::const_iterator const_iterator;
virtual void insert( T item ) = 0;
virtual bool get( T key, T& value ) const = 0;
virtual T front() const = 0;
virtual T back() const = 0;
virtual ~PriorityQueueInterface() {}
};
typename
是编译器的一个(在本例中是必需的)提示:下一个标识符是类型名称。
typedef
用于定义新类型。
答案 2 :(得分:1)
您需要使用typedef typename
代替typename
。
编写代码的方式,您告诉编译器PriorityQueueInterface有一个名为iterator的成员和一个名为const_iterator的成员。
使用typedef typename
,你会告诉它它有一个名为iterator的 type 和一个名为const_iterator
的 type 。
答案 3 :(得分:-1)
将typename更改为typedef。
template <typename T> class PriorityQueueInterface
{
public:
typedef ArrayList<T>::iterator iterator;
typedef ArrayList<T>::const_iterator const_iterator;
virtual void insert( T item ) = 0;
virtual bool get( T key, T& value ) const = 0;
virtual T front() const = 0;
virtual T back() const = 0;
virtual ~PriorityQueueInterface() {}
};