类型命名迭代器不是类型

typenamed iterator is not a type

我正在编写一个模板化的 class,其中涉及迭代器的使用。我发现了很多关于在将迭代器与模板一起使用时需要如何对其进行类型命名的问题,所以我想知道为什么它仍然无法正常工作。

#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;,但是会抛出错误 "std::list::iterator is not a type"

鉴于我正在使用 typename,我做错了什么?

我正在使用带有参数 -std=c++0x 的 g++ 4.4.5,如果相关的话。

你想要一个类型定义(现在你正在声明一个名为 iter 的对象):

typedef typename std::list<T>::iterator iter;

另外,在binarySearch的声明中需要typename:

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

函数中

iter binarySearch(T toFind, std::list<T>::iterator min, std::list<T>::iterator max);

您将私有数据成员 iter 指定为函数的 return 类型。

这个

typename std::list<T>::iterator iter;

是类型为 typename std::list<T>::iterator

的私有数据成员 iter 的定义

如果你指的是类型名称而不是数据成员,那么你应该这样写

typedef typename std::list<T>::iterator iter;

using iter =  typename std::list<T>::iterator;

此外,最好遵循 C++ 标准中使用的通用约定并将类型命名为

typedef typename std::list<T>::iterator iterator;

在这种情况下,函数声明如下所示

iterator binarySearch(T toFind, iterator min, iterator max);

此外,当迭代器位于函数声明时的值之前会更好

iterator binarySearch( iterator min, iterator max, T toFind );