【问题标题】:Getting error in c++ STL in Visual Studio 2015在 Visual Studio 2015 中的 c++ STL 中出现错误
【发布时间】: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 用于mapsetmap 中的 Keyconst,因此您无法更改它,但您可以将普通的 iterators 放入其中(您可以从中更改值)。
  • 如果您尝试更改地图或集合中的键,2010 并未强制执行此操作。您可以在 2010 年声明非常量迭代器并弄乱映射和设置内部结构。现在在 2015 年不允许这样做。这是我在 2010 年到 2015 年移植代码时遇到的情况。
  • @MehulDonga:你的ThreadPairData typedef 有一个Test 对象作为内部pair 的第一个类型,但你给它一个Test *。这是您的实际代码吗?你为什么使用new?你喜欢内存泄漏吗?

标签: c++ c++11 dictionary stl visual-studio-2015


【解决方案1】:

在第一个错误中,entry-&gt;GetHandle() 返回一个void *,这不是您要存储到的地图的键类型。您要么需要更改 GetHandle 返回的类型,要么将 void * 转换为正确的 const 类型。

第二个错误是因为GetThreadId 正在返回unsigned int,但您的地图需要DWORD(即unsigned long)。您需要更改返回类型、强制转换或更改映射中的类型以修复它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 2016-02-10
    • 2017-02-21
    • 1970-01-01
    相关资源
    最近更新 更多