如何使用迭代器来解决这个问题?
Posted
技术标签:
【中文标题】如何使用迭代器来解决这个问题?【英文标题】:how to solve this problem with a cast of iterator? 【发布时间】:2009-10-27 18:14:23 【问题描述】:编译器(VC8)错误是: 错误 C2680:“std::_Tree<_traits>::iterator”:dynamic_cast 的目标类型无效 模拟错误的源代码: [编辑]源现已修复
#include <map>
#include <string>
struct tag_data
int in;
int on;
std::string sn;
;
class myclass
private:
typedef std::map<std::string, tag_data> TypeData;
TypeData MapStorage;
typedef std::map<unsigned long, TypeData::iterator > TypeToThreadIterMapStorage;
TypeToThreadIterMapStorage ThreadIterMapStorage;
public:
bool find( std::string& k)
TypeData::const_iterator theData ;
theData = MapStorage.find(k);
//ThreadIterMapStorage [ 0 ] = MapStorage.begin();// this is ok
ThreadIterMapStorage [ 1 ] = dynamic_cast<TypeData::iterator>(theData); // the error occurs here
return theData != MapStorage.end();
virtual ~myclass()
;
int _tmain(int argc, _TCHAR* argv[])
myclass mc;
return 0;
【问题讨论】:
请为问题添加 C++ 标签... 【参考方案1】:首先你的 dynamic_cast 语法是错误的(或者可能是格式问题?):
dynamic_cast 语法:dynamic_cast<DerivedClassName*>(BaseClass*)
OR
dynamic_cast<DerivedClassNameReference>(BaseClassReference)
我觉得这段代码很可疑。你想达到什么目的?为什么要动态转换迭代器?这没有任何意义。
编辑
map 的begin()
有两个重载,一个返回 const_iterator,另一个返回非 const_iterator。在您注释的代码中,由于您的 TypeToThreadIterMapStorage
映射的 value_type 是非常量迭代器,因此使用了 begin() 的第二个版本。但是,Data 迭代器的类型是 const_iterator,编译器抱怨无法将 const_iterator 转换为非 const 迭代器。您需要的是 const_cast
来删除对象的常量,而不是 dynamic_cast
。但请注意,这是一件危险的事情。
更简单的方法是将 theData 声明为非常量迭代器。
【讨论】:
查看类型TypeToThreadIterMapStorage,想在容器中为该类型做赋值。【参考方案2】:是什么让你认为 TypeData::iterator 和 TypeData::const_iterator 甚至是相关的?
为什么不将 'theData' 的类型更改为迭代器?
TypeData::iterator theData = MapStorage.find(k);
【讨论】:
忙于考虑使用哪个演员表。直到为时已晚才看到这个:-(以上是关于如何使用迭代器来解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章
如何确定 ArrayList 迭代器接下来将返回的对象类型?