无法将迭代器传递给 C++ 中的类方法

Can't pass iterator to a class method in C++

本文关键字:C++ 类方法 迭代器      更新时间:2023-10-16

我有以下简单的类:

template <class T> class ListWrap
{
std::list<T> m_List;
explicit ListWrap(std::initializer_list<T> data)
{
Set(data);
}
void Set(std::initializer_list<T> data)
{
m_List.clear();
m_List.insert(m_List.end(), data);
}
};

这工作正常,我可以使用初始值设定项列表ListWrap实例化一个新对象。现在我还想允许从另一个列表或迭代器设置m_List,并从复制构造函数使用它。

所以我尝试添加以下内容:

// copy constructor
explicit ListWrap(const ListWrap& Other)
{
Set(Other.m_List.begin());
}
void Set(std::iterator<std::list<T>, T> Iterator)
{
m_List.clear();
m_List.insert(m_List.end(), Iterator);
}

但是,现在当我尝试编译时,出现以下错误:

error C2664: cannot convert argument 1 from
'std::_List_const_iterator<std::_List_val<std::_List_simple_types<int>>>'
to 'std::initializer_list<_Ty>'*

此错误消息是指在新复制构造函数中调用Set()。因此,它似乎尝试将"旧"Set()方法与初始值设定项列表一起使用,而不是接收迭代器的第二个"新"Set()版本。

知道我在这里错过了什么吗?

// copy constructor
explicit ListWrap(const ListWrap& Other)
{
Set(Other.m_List.begin());
}

Other是常量引用,所以Other.m_List.begin()常量迭代器。

尝试std::iterator<const std::list<T>&, T>std::list<T>::const_iterator作为Set函数的参数类型。

编辑:

这是一个工作代码。

#include <iostream>
#include <list>
using namespace std;
template <class T> class ListWrap
{
public:
std::list<T> m_List;
explicit ListWrap(std::initializer_list<T> data)
{
Set(data);
}
// copy constructor
explicit ListWrap(const ListWrap& Other)
{
Set(Other.m_List.begin(), Other.m_List.end());
}
void Set(std::initializer_list<T> data)
{
m_List.clear();
m_List.insert(m_List.end(), data);
}
//typename std::list<T>::const_iterator also works as argument type
void Set(decltype(m_List.cbegin()) beg, decltype(m_List.cbegin()) end)
{
m_List.clear();
m_List.insert(m_List.end(), beg, end);
}
};
int main() {
ListWrap<int> l({1,2,3});
ListWrap<int> l2(l);
cout << l2.m_List.size() << endl;
return 0;
}

显然,当使用来自另一个列表的迭代器时,std::list::insert需要有三个参数,而不是来自初始值设定项列表的迭代器。不妨把const std::list<T>&作为Set的论据,并按照评论中的说明m_List = arg

请检查以下解决方案。您必须通知编译器const_iterator是类型名,因为您使用的是模板参数。

void Set(typename std::list<T>::const_iterator iter)