Как решить эту проблему с использованием итератора? - PullRequest
0 голосов
/ 27 октября 2009

Ошибка компилятора (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 ]

3 голосов
/ 27 октября 2009

Прежде всего, ваш синтаксис dynamic_cast неверен (или может быть проблема с форматированием?): Синтаксис динамической трансляции: dynamic_cast<DerivedClassName*>(BaseClass*) ИЛИ

dynamic_cast<DerivedClassNameReference>(BaseClassReference)

Этот код выглядит очень подозрительно для меня. Чего ты пытаешься достичь? Почему вы хотите динамически передавать итератор? Это не имеет никакого смысла.

EDIT begin() карты имеет две перегрузки, одна из которых возвращает const_iterator, а другая - не const_iterator. В вашем закомментированном коде, поскольку value_type вашей TypeToThreadIterMapStorage карты является неконстантным итератором, используется вторая версия begin (). Однако тип итератора Data - const_iterator, и компилятор жалуется, что const_iterator нельзя преобразовать в неконстантный итератор. Вам требуется const_cast для удаления константности объекта, а не dynamic_cast. Но учтите, что это опасно.

Более простой способ - объявить данные как неконстантный итератор.

2 голосов
/ 27 октября 2009

Что заставляет вас думать, что TypeData :: iterator и TypeData :: const_iterator даже связаны?

Почему бы не изменить тип 'theData' на итератор?

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