typenamed迭代器不是一个类型

时间:2015-04-01 08:53:54

标签: c++ templates c++11 iterator

我正在编写一个模板化的类,它涉及使用迭代器。如果你将它与模板一起使用,我发现了很多关于你如何键入一个迭代器的问题,所以我想知道它为什么还没有工作。

#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,如果它是相关的。

2 个答案:

答案 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 );