我正在编写一个模板化的类,它涉及使用迭代器。如果你将它与模板一起使用,我发现了很多关于你如何键入一个迭代器的问题,所以我想知道它为什么还没有工作。
#pragma once
#include <iterator>
#include <list>
#include <tuple>
template <class T>
class Quack
{
private:
std::list<T> data;
typename std::list<T>::iterator iter;
public:
Quack();
void insert(T dat);
std::tuple<T, T> poppop();
private:
//error: 'iter' does not name a type
iter binarySearch(T toFind, std::list<T>::iterator min, std::list<T>::iterator max);
};
我也尝试了typedef typename std::list<T>::iterator iter;
,但是这会引发错误&#34; std :: list :: iterator不是类型&#34;
所以鉴于我使用typename
,我做错了什么?
我使用带有参数-std = c ++ 0x的g ++ 4.4.5,如果它是相关的。
答案 0 :(得分:8)
你想要一个typedef(现在你宣布一个名为iter
的对象):
typedef typename std::list<T>::iterator iter;
此外,您需要typename
声明中的binarySearch
:
iter binarySearch(T toFind, typename std::list<T>::iterator min, typename std::list<T>::iterator max);
当然,此时您可以使用iter
:
iter binarySearch(T toFind, iter min, iter max);
答案 1 :(得分:2)
在功能
中iter binarySearch(T toFind, std::list<T>::iterator min, std::list<T>::iterator max);
您指定了私有数据成员iter作为函数的返回类型。
此
typename std::list<T>::iterator iter;
是类型为iter
typename std::list<T>::iterator
的定义
如果您指的是类型名称而不是数据成员,那么您应该写
typedef typename std::list<T>::iterator iter;
或
using iter = typename std::list<T>::iterator;
最好遵循C ++标准中使用的genaral convetion并命名类型
typedef typename std::list<T>::iterator iterator;
在这种情况下,函数声明将类似于
iterator binarySearch(T toFind, iterator min, iterator max);
当迭代器优先于函数声明为
时的值时,也会更好iterator binarySearch( iterator min, iterator max, T toFind );