如何将 迭代器的指针转换成 DWORD

coldplay968 2007-05-08 04:48:48
list< PERSONINFO >::iterator it;
it = m_FriInfo_list.begin();
for(; it!= m_FriInfo_list.end() ; ++it)
{
if( 0 == strcmp( (*it).UserId , Add_OK.userID) )
{
pit = (DWORD ) (it);
}
}
我这样做就报错'type cast' : cannot convert from 'class std::list<struct PERSONINFO,class std::allocator<struct PERSONINFO> >::iterator' to 'unsigned long'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

告诉我该怎么办
...全文
697 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
EulerWong 2010-10-19
  • 打赏
  • 举报
回复
#include <iostream>
#include <vector>
using namespace std;
class A
{
public:
int& getx(void) {return x;}
private:
int x;
};

void fun(A* a, A* b, double c)
{
cout<<"Hello World\n";
}
int main(void)
{
vector<A> vec(9);

fun(static_cast<A*>(&(*vec.begin())), static_cast<A*>(&(*vec.end())), 4);
return 0;
}
上面是我的程序,为什么编译链接都通过了。运行进却是错的呢?先谢谢了。
coldplay968 2007-05-10
  • 打赏
  • 举报
回复
问题解决了,代码又要改了,有点烦啊
coldplay968 2007-05-10
  • 打赏
  • 举报
回复
楼上怎么不早来啊
taodm 2007-05-10
  • 打赏
  • 举报
回复
那你为什么要保留iterator呢?直接存数据的指针即可。
coldplay968 2007-05-10
  • 打赏
  • 举报
回复
我是想把 DWORD pIt = reinterpret_cast<DWORD> (&(*it_) );
pIt保存在树形控件的 SetItemData里面,
当双击的时候,通过指针就可以直接的获得到数据,不要
重新遍历list
believefym 2007-05-10
  • 打赏
  • 举报
回复
DWORD pIt = reinterpret_cast<DWORD> (&(*it_) );
--------
这个只是把第一个元素的地址强制转换为DWORD而已,难道没问题吗?DWORD只有两个字节,不够存放地址的吧
believefym 2007-05-10
  • 打赏
  • 举报
回复
pit = (DWORD ) (it);
----------
楼主的需求说清楚,为什么要这么做
如果只是想保存符合条件的位置,就再用一个迭代器好了,不用转换成DWORD类型的整型的
it2 = it;
coldplay968 2007-05-10
  • 打赏
  • 举报
回复
list<PERSONINFO>::iterator it_;
it_= m_list.begin();

DWORD pIt = reinterpret_cast<DWORD> (&(*it_) );

char str[10];

PERSONINFO * p =NULL;
p= (PERSONINFO*)pIt;

int i = p->OnLine;
strcpy (str, p->UserId );
改成这样子就可了
coldplay968 2007-05-10
  • 打赏
  • 举报
回复
to ff5dq4
你好!
有一点我不明白,我将迭代器转换成DWORD,然后再将DWORD转换回来,不可以吗?
list< PERSONINFO >::iterator it;
it = m_FriInfo_list.begin();
pit = (DWORD ) (&(*it));
int i = pit ->id;
这样做不可以吗?
ff5dq4 2007-05-09
  • 打赏
  • 举报
回复
汗~~~~~~~~~~~~~~`

迭代器是个类

指针转换为一个类对象??? 完全逻辑不通
czg516 2007-05-08
  • 打赏
  • 举报
回复
pit = (DWORD ) (it);

改成
pit = (DWORD ) (&(*it));

*it取得list中的那个元素,它的地址也是你想要的地址.

PS:你想直接把it当成指针直接转换这是不可取的,跌代器和指针是有区别的,跌代器本身是一个对象,它重载了*,->,所以给人感觉它好象是指针,其实它不是.想得到它指向的元素的地址可以用上面的方法.
星羽 2007-05-08
  • 打赏
  • 举报
回复
换换思想这样就可以了


int _tmain(int argc, _TCHAR* argv[])
{
list<int> IntList;
IntList.push_back(100);

list<int>::iterator it = IntList.begin();


DWORD p = reinterpret_cast<DWORD>(&(*it));

int v = *(int*)p;

std::cout<<v<<endl;


return 0;
}

liujiwei2007 2007-05-08
  • 打赏
  • 举报
回复
建议你看一下侯 SIR 的 《STL源码剖析》
里面都是讲 STL 的底层实现的
coldplay968 2007-05-08
  • 打赏
  • 举报
回复
对模板只是有一点了解,很多东西都没有用过
要努力学习啊
taodm 2007-05-08
  • 打赏
  • 举报
回复
看《STL源码剖析》
coldplay968 2007-05-08
  • 打赏
  • 举报
回复
上面说到的,在哪本书上有讲到啊
taodm 2007-05-08
  • 打赏
  • 举报
回复
没办法。list的iterator不是指针,是一个类对象,根本就不保证它会小于等于4字节。

65,189

社区成员

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

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