如何使用迭代器转换来解决这个问题?

时间:2009-10-27 18:14:24

标签: c++ class stl iterator

编译器(VC8)错误是:
错误C2680:'std :: _ Tree< _Traits> :: iterator':dynamic_cast的目标类型无效
模拟错误的源代码:
[EDIT]源码现已修复

#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;
}

2 个答案:

答案 0 :(得分:3)

首先,您的dynamic_cast语法错误(或者可能是格式化问题?): dynamic_cast语法:dynamic_cast<DerivedClassName*>(BaseClass*)

dynamic_cast<DerivedClassNameReference>(BaseClassReference)

这段代码对我来说很可疑。你想要实现什么目标?为什么要dynamic_cast一个迭代器?这没有任何意义。

修改 map的begin()有两个重载,一个返回const_iterator,另一个返回非const_iterator。在您的注释代码中,由于您的TypeToThreadIterMapStorage映射的value_type是非const迭代器,因此使用了begin()的第二个版本。但是,数据迭代器的类型是一个const_iterator,并且编译器抱怨const_iterator不能转换为非const迭代器。您需要的是const_cast来删除对象的常量,而不是dynamic_cast。但请注意,这是一件危险的事情。

更简单的方法是将theData声明为非const迭代器。

答案 1 :(得分:2)

是什么让你认为TypeData :: iterator和TypeData :: const_iterator甚至是相关的?

为什么不将'theData'的类型更改为迭代器?

TypeData::iterator theData = MapStorage.find(k);