C++ 中抽象模板类中的类型名

typename in abstract template class in c++

本文关键字:类型 抽象 C++      更新时间:2023-10-16

我正在尝试创建一个封装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() {}
};