【问题标题】:How can an iterator be returned from a function/method? [duplicate]如何从函数/方法返回迭代器? [复制]
【发布时间】:2020-04-12 14:54:17
【问题描述】:

我试图了解迭代器如何成为返回类型,但我无法这样做。我知道在类集中,find() 方法返回一个迭代器,但是当我将 set 类封装在包装器 Set 类中时,我无法返回迭代器。为什么会这样?

Body of Set class
...
typedef typename set<T>::iterator SetIterator; //No issue
SetIterator Find(T data); //No issue
...

Implementation
...
template <class T>
SetIterator Set<T>::Find(T data) //SetIterator does not name a type error message
{
    SetIterator i = dataSet.find(data);
    return i;
}

谁能解释我做错了什么?

【问题讨论】:

    标签: c++ iterator set


    【解决方案1】:

    提供程序应采用“SetIterator”名称的范围。 MyClass&lt;T&gt;::SetIterator

    #include <set>
    using namespace std;
    
    template<typename T>
    class MyClass {
       typedef typename set<T>::iterator SetIterator;
       SetIterator Find(T data);
    private:
       set<T> dataSet;
    };
    
    template<typename T>
    MyClass<T>::SetIterator MyClass<T>::Find(T data)
    {
       SetIterator i = dataSet.find(data);
       return i;
    }
    

    【讨论】:

    • 你需要在返回类型之前说typename,在实现中。
    • @cigien 谢谢。它在 vamirio-chan 的 MyClass::SetIterator MyClass::Find(T data) 之前添加“typename”后起作用
    • @vamirio-chan 为什么要在这种情况下添加所需的范围?当我使用 typedef 类型名时,我想更深入地了解何时应该提供范围。
    • @JinYuChan 因为您的 typedef 仅存在于您的课程范围内。在这个范围之外,程序不知道这个 typedef。返回类型被视为全局范围值,即您可以在可以调用此方法的代码的任何给定部分中确定返回类型(例如使用 decltype() )。除了返回值之外,方法中的所有其他内容都被视为类范围,因此您无需在方法或其参数列表(括号)中编写范围运算符。附:从 C++14 开始,你可以使用 auto。
    【解决方案2】:

    SetIterator 在类的范围内。在MyClass&lt;T&gt;:: 之前,名称不会像在类范围内一样被解析。所以要么手动指定类:

    template<typename T>
    typename MyClass<T>::SetIterator MyClass<T>::Find(T data) {
        // ...
    }
    

    或者使用尾随返回类型:

    template<typename T>
    auto MyClass<T>::Find(T data) -> SetIterator {  // Resolved as `MyClass<T>::SetIterator`
        // ...
    }
    

    (在这种情况下,您可以只使用auto,因为它会从return 语句中推断为SetIterator

    【讨论】:

      猜你喜欢
      • 2022-10-02
      • 2021-12-26
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多