如何将 迭代器的指针转换成 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

告诉我该怎么办
...全文
589 点赞 收藏 17
写回复
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字节。
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告