Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从函数/方法返回迭代器?_C++_Iterator_Set - Fatal编程技术网

C++ 如何从函数/方法返回迭代器?

C++ 如何从函数/方法返回迭代器?,c++,iterator,set,C++,Iterator,Set,我试图理解迭代器是如何成为返回类型的,但我无法做到这一点。我知道在类集合中,find()方法返回一个迭代器,但当我将集合类封装在包装器set类中时,我无法返回迭代器。为什么会这样 Body of Set class ... typedef typename set<T>::iterator SetIterator; //No issue SetIterator Find(T data); //No issue ... Implementation ... template <

我试图理解迭代器是如何成为返回类型的,但我无法做到这一点。我知道在类集合中,
find()
方法返回一个迭代器,但当我将集合类封装在包装器
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;
}
集合类的主体
...
typedef typename set::iterator SetIterator//没问题
SetIterator查找(T数据)//没问题
...
实施
...
样板
SetIterator Set::Find(T data)//SetIterator未命名类型错误消息
{
SetIterator i=dataSet.find(数据);
返回i;
}

有人能解释一下我做的哪些地方不正确吗?

提供程序使用“SetIterator”名称的范围<代码>MyClass::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;
}
#包括
使用名称空间std;
样板
类MyClass{
typedef typename set::iterator SetIterator;
SetIterator查找(T数据);
私人:
设置数据集;
};
样板
MyClass::SetIterator MyClass::Find(T数据)
{
SetIterator i=dataSet.find(数据);
返回i;
}

SetIterator
在类的范围内。在
MyClass::
之前,名称不会像在类范围中一样解析。因此,可以手动指定类:

template<typename T>
typename MyClass<T>::SetIterator MyClass<T>::Find(T data) {
    // ...
}
模板
typename MyClass::SetIterator MyClass::Find(T数据){
// ...
}
或使用尾随返回类型:

template<typename T>
auto MyClass<T>::Find(T data) -> SetIterator {  // Resolved as `MyClass<T>::SetIterator`
    // ...
}
模板
自动MyClass::Find(T数据)->SetIterator{//解析为`MyClass::SetIterator`
// ...
}

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

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