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

C++ 无法将列表迭代器强制转换为对象,c++,C++,我得到一个错误: error C2682: cannot use 'dynamic_cast' to convert from 'std::_List_iterator<_Mylist>' to 'UserBean *' 错误C2682:无法使用'dynamic_cast'将'std::_List_iterator'转换为'UserBean*' 执行时: list<UserBean> * userBeans = getUserBeans(); for(list<

我得到一个错误:

error C2682: cannot use 'dynamic_cast' to convert from 'std::_List_iterator<_Mylist>' to 'UserBean *'
错误C2682:无法使用'dynamic_cast'将'std::_List_iterator'转换为'UserBean*'
执行时:

list<UserBean> * userBeans = getUserBeans();

for(list<UserBean>::iterator i = userBeans->begin(); i != userBeans->end(); i++)
   UserBean * newUser = dynamic_cast<UserBean*>(i);
list*userBeans=getUserBeans();
对于(列表::迭代器i=userBeans->begin();i!=userBeans->end();i++)
UserBean*newUser=dynamic\u cast(i);

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

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

UserBean* newUser = &*i;

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

容器的类型是
list
而不是
list

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

UserBean userBean = *i;

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

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

UserBean & newUser = *i;

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

UserBean &newUser = *i;
或:

迭代器通常重写
->
运算符,以便在迭代器引用实际对象实例(您的实例)而不是指向对象实例的指针的情况下,您可以访问引用项的成员,例如:

i->SomeMemberHere

是的,在这里使用
UserBean&
比使用
UserBean*
更好,因为它只引用一个对象。即使列表中确实包含指针(可能不应该包含指针),您仍然需要取消对迭代器的引用,而不是执行一些奇怪的强制转换。“您容器的输入错误”-喜欢它@史蒂芬尼罗兰:对不起,在你添加关于取消引用的部分之前,我写了评论。但是我其余的评论——指针和容器很少能很好地混合。但是你为什么这么说呢?我在C++中已经使用指针容器多年了?他的列表不是指针列表,而是对象列表!哦,你是说如果OP对UserBean使用多态性,那么他就会成为对象切片的受害者。。。所以你的意思是“容器和对象”很少能很好地混合。是这样吗?在java中就是这样。UserBean user=(UserBean)迭代器.next();类似的东西,也许在C++中也是如此!
UserBean *newUser = &(*i);
i->SomeMemberHere