繁体   English   中英

C ++中抽象模板类的typename

[英]typename in abstract template class in c++

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

编辑 :好的,我想我发现了问题,它与这段代码无关。 我重新创建了原始帖子,希望有人还会发现它有用。

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

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

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

您应该使用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

您需要使用typedef typename而不是typename

编写代码的方式是,告诉编译器PriorityQueueInterface有一个称为迭代器的成员和一个称为const_iterator的成员。

通过使用typedef typename你会告诉它,它有一个叫做迭代器类型和一种被称为 const_iterator

将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() {}
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM