无法将列表迭代器强制转换为对象

时间:2013-04-18 00:19:50

标签: c++

我收到错误:

error C2682: cannot use 'dynamic_cast' to convert from 'std::_List_iterator<_Mylist>' to 'UserBean *'

执行时:

list<UserBean> * userBeans = getUserBeans();

for(list<UserBean>::iterator i = userBeans->begin(); i != userBeans->end(); i++)
   UserBean * newUser = dynamic_cast<UserBean*>(i);

我做错了什么,或者你不能将迭代器项转换为对象吗?

4 个答案:

答案 0 :(得分:12)

有时候迭代器被实现为容器项的原始指针,但有时候它们根本不是指针,所以不要那样对待它们。访问迭代器引用的项的正确方法是取消引用迭代器,例如:

UserBean &newUser = *i;

或者:

UserBean *newUser = &(*i);

迭代器通常会覆盖->运算符,因此您可以访问引用项的成员,如果迭代器引用实际的对象实例(您执行此操作)而不是指向对象实例的指针,例如:

i->SomeMemberHere

答案 1 :(得分:5)

  

我做错了什么,或者你不能将迭代器项转换为对象吗?

不,你不能。您可以取消引用迭代器来访问对象:

UserBean & newUser = *i;

答案 2 :(得分:2)

你不能将迭代器转换为这样的指针 - 这不是dynamic_cast的用途。在处理多态行为时(如果有的话),您应该只使用dynamic_cast。但是,您可以这样做:

UserBean* newUser = &*i;

取消引用迭代器以获取对象,然后获取对象的地址。

答案 3 :(得分:0)

您的容器类型为list<UserBean>而不是list<*UserBean>

这就是你的迭代器错误的原因。它的类型是UserBean。不是UserBean*

UserBean userBean = *i;

UserBean& userBean = *i;