1

我正在尝试制作一个封装 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:语法错误:缺少 ';' 在'<'之前
我不明白,因为如果我不定义这些类型名,它就可以工作。如果类不是抽象的,类型名就可以工作,但我希望接口包含这些迭代器。

编辑:好的,我想我找到了问题,它与这段代码无关。我重新创建了原始帖子,我希望有人仍然会觉得它有用。

4

4 回答 4

5

您需要typedef而不是typename创建类型别名。而且您还需要typename,因为它是依赖类型:

typedef typename ArrayList<T>::iterator iterator;
^^^^^^^

您的代码声明iteratorconst_iterator成为数据成员,而不是类型。

于 2013-09-23T11:33:53.763 回答
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用于定义新类型。

于 2013-09-23T11:35:10.083 回答
1

您需要使用typedef typename而不是typename.

您编写代码的方式是告诉编译器 PriorityQueueInterface 有一个名为 iterator 的成员和一个名为 const_iterator 的成员。

通过使用typedef typename你会告诉它它有一个叫做 iterator 的类型一个叫做.const_iterator

于 2013-09-23T11:32:32.837 回答
-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() {}
};
于 2013-09-23T11:32:56.410 回答