2008报错,不知道这是为什么???

szjszj16 2014-05-23 07:36:49
类中有 一个结构体成员,结构体中有一个迭代器
我在构造函数中这样初始化ZeroMemory
现在它有一个成员方法形参是迭代器去修改结构体中的迭代器
在2003中传递NULL是可以的,现在到了2008中就会报错
error C2664: “Hero::LinkNpcData”: 不能将参数 1 从“int”转换为“std::_Vector_iterator<_Ty,_Alloc>”
...全文
146 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
szjszj16 2014-05-26
  • 打赏
  • 举报
回复
struct sPick { CSkinMesh* pSkMesh; vector< DsModelData* >::iterator pvDsRead; BOOL IsDraw; // 是否渲染 FLOAT fDist; }; 类Hero::Hero{} 成员变量 sPick m_NpcData; 构造函数初始化机构体 Hero::Hero( LPDIRECT3DDEVICE9 pDevice , CSorcery *pSorcery , CTechnica *pTechnica , PlayerBag *pBag ) { ZeroMemory( &m_NpcData , sizeof(m_NpcData) ); } 成员函数 BOOL Hero::LinkNpcData( vector< DsModelData* >::iterator pvDsRead , CSkinMesh* pSkMesh ) { m_NpcData.pSkMesh = pSkMesh; m_NpcData.pvDsRead = pvDsRead; return TRUE; } 调用 if ( m_GameType == GM_NORGAME ) { m_pHero->SetPos( m_pHeroPoint->GetPos() , TRUE ); // 传递NULL m_pHero->LinkNpcData( NULL , NULL ); m_IsRun = FALSE; m_IsMoveDestPos = FALSE; } 调用 BOOL Hero::AutoAttack( FLOAT fFramTime , vector< CSkinMesh* > &vNpcList ) { if ( !m_IsFindNpc ) { for ( m_vMIndex = 0; m_vMIndex < vNpcList.size(); m_vMIndex++ ) { for ( vNpcList[m_vMIndex]->GetIterator() = vNpcList[m_vMIndex]->GetVector().begin(); vNpcList[m_vMIndex]->GetIterator() != vNpcList[m_vMIndex]->GetVector().end(); vNpcList[m_vMIndex]->GetIterator()++ ) { if ( (*vNpcList[m_vMIndex]->GetIterator())->NameSize <= 0.0f && (*vNpcList[m_vMIndex]->GetIterator())->HPLeng <= 0.0f || (*vNpcList[m_vMIndex]->GetIterator())->DisTime <= 0.0f ) continue; if ( !(*vNpcList[m_vMIndex]->GetIterator())->IsRend || (*vNpcList[m_vMIndex]->GetIterator())->IsNpc || (*vNpcList[m_vMIndex]->GetIterator())->IsTaskNpc ) continue; if ( (*vNpcList[m_vMIndex]->GetIterator())->HP <= 0.0f ) continue; if ( abs(D3DXVec3Length(&(m_pSkinMesh->GetPos() - (*vNpcList[m_vMIndex]->GetIterator())->Pos))) <= 1200 ) { m_DestPos = (*vNpcList[m_vMIndex]->GetIterator())->Pos; //传递迭代器 LinkNpcData( vNpcList[m_vMIndex]->GetIterator() , vNpcList[m_vMIndex] ); m_IsFindNpc = TRUE; break; } } } RunPos( m_DestPos ); } if ( m_IsFindNpc ) { Attack( fFramTime , m_NpcData.pvDsRead ); } return TRUE; }
Falleyes 2014-05-26
  • 打赏
  • 举报
回复
引用 8 楼 szjszj16 的回复:
[quote=引用 7 楼 Falleyes 的回复:] 你的形参应该是一个迭代器,那么你传入NULL应该是告诉函数不操作。 现在vs2008不允许NULL对迭代器赋值,那么你如果不想改形参的话,那就在实参传入上做文章。 如果你之前在函数中定义if(iter==NULL)return; 那么使用a.end()作为实参,只需要改成if(iter==a.end())return;即可。 因为a.end()指向最后一个元素之后,不指向这个容器a中的任何元素,就可以直接把元素操作和不做任何操作区分开来了。
我说明一下 函数只是简单的为迭代器赋值为NULL,其他什么都没有做 你这里的a是一个vector,我调用时只有NULL,这个a是不存在的啊 [/quote]为了清楚一些你的代码究竟是什么样子,还是把代码贴上来吧。光这样说,我也不清楚你到底具体是怎么写的。
szjszj16 2014-05-26
  • 打赏
  • 举报
回复
引用 7 楼 Falleyes 的回复:
你的形参应该是一个迭代器,那么你传入NULL应该是告诉函数不操作。 现在vs2008不允许NULL对迭代器赋值,那么你如果不想改形参的话,那就在实参传入上做文章。 如果你之前在函数中定义if(iter==NULL)return; 那么使用a.end()作为实参,只需要改成if(iter==a.end())return;即可。 因为a.end()指向最后一个元素之后,不指向这个容器a中的任何元素,就可以直接把元素操作和不做任何操作区分开来了。
我说明一下 函数只是简单的为迭代器赋值为NULL,其他什么都没有做 你这里的a是一个vector,我调用时只有NULL,这个a是不存在的啊
Falleyes 2014-05-25
  • 打赏
  • 举报
回复
你的形参应该是一个迭代器,那么你传入NULL应该是告诉函数不操作。 现在vs2008不允许NULL对迭代器赋值,那么你如果不想改形参的话,那就在实参传入上做文章。 如果你之前在函数中定义if(iter==NULL)return; 那么使用a.end()作为实参,只需要改成if(iter==a.end())return;即可。 因为a.end()指向最后一个元素之后,不指向这个容器a中的任何元素,就可以直接把元素操作和不做任何操作区分开来了。
Falleyes 2014-05-25
  • 打赏
  • 举报
回复
引用 5 楼 szjszj16 的回复:
[quote=引用 4 楼 Falleyes 的回复:] [quote=引用 3 楼 szjszj16 的回复:] [quote=引用 1 楼 tujiaw 的回复:] 不能把NULL赋值给迭代器 把迭代器改成int存储vector下标吧一样可以达到你的要求。
可是其他地方有调用,直接传递迭代器实参 如果改的话,不是会对其他的调用有影响吗 [/quote]把迭代器赋值为a.end()传入函数,这样迭代器指向尾元素之后,当进入循环会立即和a.end()相等,而跳过循环。[/quote] 那我之前有的调用是传递NULL,现在改成下标的话,应该传递什么值呢?[/quote]这个你要引用1楼去问他,因为我只是看到你在三楼的顾虑,才引用3楼的内容。
szjszj16 2014-05-25
  • 打赏
  • 举报
回复
引用 4 楼 Falleyes 的回复:
[quote=引用 3 楼 szjszj16 的回复:] [quote=引用 1 楼 tujiaw 的回复:] 不能把NULL赋值给迭代器 把迭代器改成int存储vector下标吧一样可以达到你的要求。
可是其他地方有调用,直接传递迭代器实参 如果改的话,不是会对其他的调用有影响吗 [/quote]把迭代器赋值为a.end()传入函数,这样迭代器指向尾元素之后,当进入循环会立即和a.end()相等,而跳过循环。[/quote] 那我之前有的调用是传递NULL,现在改成下标的话,应该传递什么值呢?
Falleyes 2014-05-25
  • 打赏
  • 举报
回复
引用 3 楼 szjszj16 的回复:
[quote=引用 1 楼 tujiaw 的回复:] 不能把NULL赋值给迭代器 把迭代器改成int存储vector下标吧一样可以达到你的要求。
可是其他地方有调用,直接传递迭代器实参 如果改的话,不是会对其他的调用有影响吗 [/quote]把迭代器赋值为a.end()传入函数,这样迭代器指向尾元素之后,当进入循环会立即和a.end()相等,而跳过循环。
szjszj16 2014-05-24
  • 打赏
  • 举报
回复
引用 1 楼 tujiaw 的回复:
不能把NULL赋值给迭代器 把迭代器改成int存储vector下标吧一样可以达到你的要求。
可是其他地方有调用,直接传递迭代器实参 如果改的话,不是会对其他的调用有影响吗
Falleyes 2014-05-23
  • 打赏
  • 举报
回复
直接把实参改成int类型,传入要访问数据的位置。 函数体内把迭代器指向容器开头吧,然后根据传入的n进行自增。
ningto.com 2014-05-23
  • 打赏
  • 举报
回复
不能把NULL赋值给迭代器 把迭代器改成int存储vector下标吧一样可以达到你的要求。

65,208

社区成员

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

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