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

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&lt;DerivedClassName*&gt;(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 迭代器接下来将返回的对象类型?

Google Colab 花费太多时间来训练分类器。如何解决这个问题?

如何使用@property 装饰器来限制列表中的值