c ++中抽象模板类中的typename

时间:2013-09-23 11:29:36

标签: c++ interface typename

我正在尝试创建一个封装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;'之前 我不明白,因为如果我没有定义那些类型名称,它就有效。如果类不是抽象的,则类型名称可以工作,但我希望接口包含这些迭代器。

编辑:好的,我认为我发现了问题,它与此代码无关。我重新创建了原帖,我希望有人会发现它很有用。

4 个答案:

答案 0 :(得分:5)

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

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

您的代码声明iteratorconst_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() {}
};