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。