for-each 循环生成错误,但 for(it=begin()...在遍历 std::map 包含 unique_ptr 时不会
for-each loop generates error but for(it=begin()... doesn't when iterating through std::map containg unique_ptr
当我在std::map
上使用for-each
样式的循环时,但当我使用iterator-incrementing for-loop
时,我得到了一个奇怪的错误。为什么会这样?
这不会产生任何错误:
for(auto it = SubjectList.begin(); it!= SubjectList.end(); ++it){
Hist2D<int> h2d(25,25);
}
然而,这会产生一个错误:
for(auto subject: SubjectList){
Hist2D<int> h2d(25,25);
}
如下:
ctest.cpp:406:23: error: use of deleted function ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const std::basic_string<char>; _T2 = std::unique_ptr<ListOfNumericLists<int> >]’
for(auto subject: SubjectList){
^
In file included from /usr/include/c++/4.9/bits/stl_algobase.h:64:0,
from /usr/include/c++/4.9/memory:62,
from ctest.cpp:1:
/usr/include/c++/4.9/bits/stl_pair.h:127:17: note: ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const std::basic_string<char>; _T2 = std::unique_ptr<ListOfNumericLists<int> >]’ is implicitly deleted because the default definition would be ill-formed:
constexpr pair(const pair&) = default;
这是std::map
的声明
std::map<std::string, std::unique_ptr<ListOfNumericLists<int>>> SubjectList;
错误是您的映射对不可复制,您需要迭代引用
for(auto& subject: SubjectList)
或者,如果你不打算突变这些元素,你应该让它们成为const
和
for(auto const& subject: SubjectList)
这是因为std::map
的每个元素都是
std::pair<std::string, std::unique_ptr<ListOfNumericLists<int>>
因此,由于存在std::unique_ptr
,元素是不可复制的
for(auto subject: SubjectList)
创建映射中每个键/值对的名为subject
的副本。由于您的值类型是无法复制的std::unique_ptr
,因此也无法复制该对。因此出现了错误。
尝试
for(const auto &subject: SubjectList)
相反。
顺便说一句,迭代器循环当然工作得很好,因为您甚至没有访问,更不用说尝试复制那里的映射内容了。
相关文章:
- 存储在 std::map/std::set 中,与在存储所有数据后对向量进行排序
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- 无法在 std::map<std::string,std::shared_ptr 中设置值<class>>
- 如何在C++中迭代集合映射(std::map<std::set< char>, int >)?
- 如何初始化结构字段 std::map<std::string, std::string>称为参数
- issue with std::map std::find
- 为什么 std::map< std::map >不释放内存?
- C++ map<std::string> vs map<char *> 性能(我知道,"again?" )
- 确定运行时std::map/std::set的内存使用情况
- 映射上的模板参数无效 std::map< std::string, Stock*> &Stock
- 我的SFINAE检查std::map/std::vector有什么问题
- 使用 std::map<std::string, int> 计算表达式树
- 将数据从两种不同的数据结构插入 std::map <std::string, int> mymap 并通过套接字发送
- 类中的编译器错误,数据类型为 typedef map<std::string,std::p air<std::string,vector<int>>> MapPai
- C++ std::map<std::string, std::set<std::string>> .如何循环设置值?
- 如何填写和访问 std::map<std::p air<enum1, enum2>, funcPtr>?
- 二进制'<':找不到 map<std::string shared_ptr 的运算符<Foo>>
- 如何将 2 个字符* 数组直接映射到 std::map<std::string,std::string>
- C++ std::map<std::string, int> 获取键以特定字符串开头的值
- 从取消引用的迭代器返回 std::map<std::string, int> 时出现巨大的内存泄漏