不能将列表迭代器强制转换为对象

Cannot cast list iterator to an object

本文关键字:转换 对象 列表 迭代器 不能      更新时间:2023-10-16

我得到了错误:

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);

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

有时迭代器被实现为指向容器项的原始指针,但大多数情况下,它们根本不是指针,所以不要这样对待它们。正确的访问迭代器所引用的项的方法是对迭代器解引用,例如:

UserBean &newUser = *i;

或:

UserBean *newUser = &(*i);

迭代器通常覆盖->操作符,以便在迭代器指向实际对象实例而不是指向对象实例的指针的情况下,您可以访问被引用项的成员,例如:

i->SomeMemberHere

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

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

UserBean & newUser = *i;

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

UserBean* newUser = &*i;

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

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

这就是为什么你的迭代器是错误的。其类型为UserBean。不是UserBean* .

UserBean userBean = *i;

UserBean& userBean = *i;