【发布时间】:2015-12-23 05:59:27
【问题描述】:
我有从 Visual Studio 2010 升级到 2015 的项目。在 2010 年一切正常,但在 2015 年我遇到与 C++11 STL 相关的编译器错误。 我试图理解和搜索,但并不清楚 C++ 发生了什么变化。 我在这一行遇到错误
`pair<DispatchMap::iterator, bool> res(m_dispatchMap.insert(make_pair(entry->GetHandle(), _af_new CallbackMap(1, entry))));`
错误是。
Error C2664 'void std::_Tree<std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,false>>::insert(std::initializer_list<std::pair<const _Kty,_Ty>>)':
cannot convert argument 1
from 'std::pair<void *,std::list<DispatchThread::CallbackEntryBasePtr,std::allocator<_Ty>> >'
to 'std::pair<const _Kty,_Ty> &&'
C++11 地图有什么变化吗?
如果能清楚明白就好了!!
【问题讨论】:
-
一个变化是您必须使用
const_iterator来访问std::map中的密钥或std::set中的数据。您不能为这些项目声明非常量iterator。不知道这是否是您错误的原因,但 C+11 强制执行地图和集合数据的const-ness。 -
请问你能在某处分割线吗?这么长的台词很难读。
-
@PaulMcKenzie 您不必将
const_iterator用于map或set。map中的 Key 是const,因此您无法更改它,但您可以将普通的iterators放入其中(您可以从中更改值)。 -
如果您尝试更改地图或集合中的键,2010 并未强制执行此操作。您可以在 2010 年声明非常量迭代器并弄乱映射和设置内部结构。现在在 2015 年不允许这样做。这是我在 2010 年到 2015 年移植代码时遇到的情况。
-
@MehulDonga:你的
ThreadPairDatatypedef 有一个Test对象作为内部pair的第一个类型,但你给它一个Test *。这是您的实际代码吗?你为什么使用new?你喜欢内存泄漏吗?
标签: c++ c++11 dictionary stl visual-studio-2015