【问题标题】:typenamed iterator is not a typetypenamed 迭代器不是类型
【发布时间】:2015-04-01 08:53:53
【问题描述】:

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

#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&lt;T&gt;::iterator iter;,但是会抛出错误“std::list::iterator is not a type”

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

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

【问题讨论】:

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


    【解决方案1】:

    你想要一个 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);
    

    【讨论】:

    • 我刚刚意识到我没有正确使用 typedef。但是,当我像这样使用 typedef 时,我仍然遇到错误,正如我在问题中提出的那样。
    【解决方案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&lt;T&gt;::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 );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多