无法将迭代器传递给 C++ 中的类方法
Can't pass iterator to a class method in C++
我有以下简单的类:
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)
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 在静态库中嵌入类方法
- 如何制作一个将函数作为参数的类方法
- 从父类方法返回子类对象
- 使用用户定义的参数调用future/async并调用类方法
- 重载类方法的不明确调用
- 单独定义模板化嵌套类方法的正确语法
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 如何访问由共享指针保存的类方法?
- 将子类方法声明为基类的友元
- 我的模板类方法返回错误类型?
- Qt将信号与另一个类方法连接
- 我无法使用C++指针指向类方法返回的 std::vector
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 检查类方法中是否(此 == nullptr)
- 从基类实例调用派生类方法而不进行强制转换
- 函数从唯一代码调用正确的子类方法
- C++ - 如何在不静态的情况下将回调绑定到类方法?
- C++ |DLL / EXE - 如何从导出的类调用另一个类方法?
- C++:从属性类调用顶级类方法