2009-10-27 72 views
0

編譯器(VC8)錯誤是:
錯誤C2680: '的std :: _樹< _Traits> ::迭代':無效目標類型的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; 
} 
+0

請爲問題添加C++標記... – Ponting 2009-10-27 18:29:34

+0

現在修復了源代碼。 – lsalamon 2009-10-27 18:34:21

回答

2

是什麼讓你認爲TypeData :: iterator和TypeData :: const_iterator甚至是相關的?

爲什麼不將「theData」的類型更改爲迭代器?

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

太忙了,想着要使用哪個演員陣容......直到演員太遲,纔看到這個演員:-( – Ponting 2009-10-27 18:48:01

3

所有的dynamic_cast語法首先是錯誤的(或者可能是格式問題?): dynamic_cast的語法:dynamic_cast<DerivedClassName*>(BaseClass*)

dynamic_cast<DerivedClassNameReference>(BaseClassReference) 

這段代碼對我來說看起來很可疑。你想達到什麼目的?你爲什麼想要dynamic_cast一個迭代器?這沒有任何意義。

編輯 地圖的begin()有兩個重載,一個返回,返回一個非常量性的常量性和其他。在你的評論代碼中,因爲你的TypeToThreadIterMapStorage map的value_type是一個非const迭代器,所以使用了begin()的第二個版本。然而,Data iteartor的類型是const_iterator,編譯器抱怨說const_iterator不能轉換爲非const迭代器。你需要的是一個const_cast來消除對象的不變性,而不是dynamic_cast。但請注意,這是一件危險的事情。

更簡單的方法是將Data聲明爲非const迭代器。

+0

請參見TypeToThreadIterMapStorage類型,希望在容器中爲此類型執行分配。 – lsalamon 2009-10-27 18:39:42