[英]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;
^^^^^^^
您的代码将iterator
和const_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.