求助,关于VS2010的std::map容器 insert数据的问题

绝世神棍 2014-09-15 08:43:59
IDE是VS2010。在向std::map<int,cocos2dx::Node*> 里插入元素时老失败。提示内容如下


2>d:\microsoft visual studio 11.0\vc\include\utility(114): error C2166: 左值指定 const 对象
2> d:\microsoft visual studio 11.0\vc\include\utility(113): 编译类 模板 成员函数“std::pair<_Ty1,_Ty2> &std::pair<_Ty1,_Ty2>::operator =(const std::pair<_Ty1,_Ty2> &)”时
2> with
2> [
2> _Ty1=const int,
2> _Ty2=cocos2d::Node *
2> ]
2> d:\microsoft visual studio 11.0\vc\include\xutility(2089): 参见对正在编译的函数 模板 实例化“std::pair<_Ty1,_Ty2> &std::pair<_Ty1,_Ty2>::operator =(const std::pair<_Ty1,_Ty2> &)”的引用
2> with
2> [
2> _Ty1=const int,
2> _Ty2=cocos2d::Node *
2> ]
2> d:\microsoft visual studio 11.0\vc\include\type_traits(599): 参见对正在编译的类 模板 实例化“std::pair<_Ty1,_Ty2>”的引用
2> with
2> [
2> _Ty1=const int,
2> _Ty2=cocos2d::Node *
2> ]
2> d:\cocos2d-x-3.0\projects\bubble\classes\gamemanager.cpp(306): 参见对正在编译的类 模板 实例化“std::is_convertible<_From,_To>”的引用
2> with
2> [
2> _From=std::pair<int,cocos2d::Node *>,
2> _To=std::pair<const int,cocos2d::Node *>
2> ]



代码如下:

int Index = -1;
auto Bubbles = m_pRoot->getChildren();
Node* pTmpNode = nullptr;
for (auto Iter = Bubbles.begin(); Iter != Bubbles.end(); ++Iter)
{
if (!Point2Index(Index, (*Iter)->getPosition()))
{
continue;
}

BubbleMap.insert(std::make_pair(Index, *Iter));
}


试了很多方法都不行,有哪位大哥能帮下小弟么?
...全文
487 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
绝世神棍 2014-09-23
  • 打赏
  • 举报
回复
结贴,问题解决了,谢谢各位的帮助。 原因是编译器报错指定的地方错了。我新建了一个工程,发现能正常使用std::map。然后就把原来的源代码一段一段的屏蔽编译。终于发现是因为std::copy这一行代码引起的错误,换成for循环就能编译通过了。奇怪的是为啥编译器报错指定的地方不是这里,初步推测应该是模板编译冲突造成的。以后再也不用std::copy了,浪费了我一个星期的时间。
ri_aje 2014-09-18
  • 打赏
  • 举报
回复
std::map::value_type 始终是 std::pair<const key_type, mapped_type>,c++11 没有在这方面做任何修改。 又看了一下错误信息,导致问题的是这句, std::is_convertible<_From,_To>”的引用 2> with 2> [ 2> _From=std::pair<int,cocos2d::Node *>, 2> _To=std::pair<const int,cocos2d::Node *> 2> ] 目测这是在用 sfinae 手法判断类型转换的时候使用了赋值判断可转换性引发的错误,严格来说这应该算 VC 标准库实现的缺陷。 至于解决方案,试一下: 1. BubbleMap.insert(std::make_pair<const int,cocos2dx::Node*>(Index, *Iter)); 或者 2. BubbleMap[Index] = *Iter; 如果编译器支持 c++11 的话,还可以试试 3. BubbleMap.emplace(Index, *Iter); 还不行的话,把你代码简化一下,弄个别人可以编译的,发上来再看。
nextseconds 2014-09-17
  • 打赏
  • 举报
回复
左值指定 const 对象,const const const !!
绝世神棍 2014-09-17
  • 打赏
  • 举报
回复
BubbleMap定义 std::map<int,cocos2dx::Node*>,网上查貌似是因为c++11的std::pair或是std::map的定义改了,以前的VS版本应该是可以的。
绝世神棍 2014-09-17
  • 打赏
  • 举报
回复
引用 6 楼 mgy4938 的回复:
左值指定 const 对象,const const const !!
这个我知道,但是我没定义const 对象。 std::map<int,cocos2dx::Node*>::value_type类型被定义成std::pari<const int, cocos2dx::Node*>。而c++11的std::map的insert模板化时会检查参数类型与value_type类型是否兼容,兼容检查中有一个是operator=。就是这个引发的,value_type的属性first的类型是const int,无法赋值。大概原因是这样的,不知道对不对。关键是我不知道怎么解决这个问题。
sg_knight 2014-09-16
  • 打赏
  • 举报
回复
左值指定 const 对象
  • 打赏
  • 举报
回复
BubbleMap 是啥类型的,是不是const的?
ri_aje 2014-09-16
  • 打赏
  • 举报
回复
看错误信息,说的是 BubbleMap 的键类型是 const 类型,发上来看看到底是怎么定义的。
勤奋的小游侠 2014-09-15
  • 打赏
  • 举报
回复
BubbleMap.insert(std::make_pair(Index, *Iter)); 这句改成 BubbleMap[Index]=*Iter;

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧