繁体   English   中英

类型命名的迭代器不是类型

[英]typenamed iterator is not a type

我正在编写一个模板类,其中涉及迭代器的使用。 我发现了许多问题,如果您将其与模板一起使用,则需要如何命名迭代器,因此我想知道为什么它仍然无法正常工作。

#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不是类型”

因此,鉴于我使用的是typename ,我做错了什么?

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

您在那里需要一个typedef(现在您要声明一个名为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指定为函数的返回类型。

这个

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 ++标准中使用的一般对流并命名为

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

在这种情况下,函数声明看起来像

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

同样,当迭代器优先于声明函数时的值时,效果会更好

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM