怎么将 迭代器的指针转换成 DWORD
如何将 迭代器的指针转换成 DWORD
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
告诉我该怎么办
------解决方案--------------------
没办法。list的iterator不是指针,是一个类对象,根本就不保证它会小于等于4字节。
------解决方案--------------------
看《STL源码剖析》
------解决方案--------------------
建议你看一下侯 SIR 的 《STL源码剖析》
里面都是讲 STL 的底层实现的
------解决方案--------------------
换换思想这样就可以了
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;
}
------解决方案--------------------
pit = (DWORD ) (it);
改成
pit = (DWORD ) (&(*it));
*it取得list中的那个元素,它的地址也是你想要的地址.
PS:你想直接把it当成指针直接转换这是不可取的,跌代器和指针是有区别的,跌代器本身是一个对象,它重载了*,-> ,所以给人感觉它好象是指针,其实它不是.想得到它指向的元素的地址可以用上面的方法.
------解决方案--------------------
汗~~~~~~~~~~~~~~`
迭代器是个类
指针转换为一个类对象??? 完全逻辑不通
------解决方案--------------------
pit = (DWORD ) (it);
----------
楼主的需求说清楚,为什么要这么做
如果只是想保存符合条件的位置,就再用一个迭代器好了,不用转换成DWORD类型的整型的
it2 = it;
------解决方案--------------------
DWORD pIt = reinterpret_cast <DWORD> (&(*it_) );
--------
这个只是把第一个元素的地址强制转换为DWORD而已,难道没问题吗?DWORD只有两个字节,不够存放地址的吧
------解决方案--------------------
那你为什么要保留iterator呢?直接存数据的指针即可。
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
告诉我该怎么办
------解决方案--------------------
没办法。list的iterator不是指针,是一个类对象,根本就不保证它会小于等于4字节。
------解决方案--------------------
看《STL源码剖析》
------解决方案--------------------
建议你看一下侯 SIR 的 《STL源码剖析》
里面都是讲 STL 的底层实现的
------解决方案--------------------
换换思想这样就可以了
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;
}
------解决方案--------------------
pit = (DWORD ) (it);
改成
pit = (DWORD ) (&(*it));
*it取得list中的那个元素,它的地址也是你想要的地址.
PS:你想直接把it当成指针直接转换这是不可取的,跌代器和指针是有区别的,跌代器本身是一个对象,它重载了*,-> ,所以给人感觉它好象是指针,其实它不是.想得到它指向的元素的地址可以用上面的方法.
------解决方案--------------------
汗~~~~~~~~~~~~~~`
迭代器是个类
指针转换为一个类对象??? 完全逻辑不通
------解决方案--------------------
pit = (DWORD ) (it);
----------
楼主的需求说清楚,为什么要这么做
如果只是想保存符合条件的位置,就再用一个迭代器好了,不用转换成DWORD类型的整型的
it2 = it;
------解决方案--------------------
DWORD pIt = reinterpret_cast <DWORD> (&(*it_) );
--------
这个只是把第一个元素的地址强制转换为DWORD而已,难道没问题吗?DWORD只有两个字节,不够存放地址的吧
------解决方案--------------------
那你为什么要保留iterator呢?直接存数据的指针即可。