2012-06-26 18 views
0

我使用的是C++,而且我遇到了以下問題,即每次調用方法「getItem()」時都會返回0,儘管這不是寫入地圖的整數,地圖也不是空的。使用「typename ...」語句作爲類屬性有什麼問題嗎?通過Iterator從模板類瀏覽映射

template <class t> 
    class P { 
    public: 
     P(); 
     int getItem(); 

    private: 
     std::map<int, P<t>* > m; 
     typename std::map<int, P<t>* >::iterator it; 
     bool visited; 
    }; 

    template <class t> 
    P<t>::P() { 
     visited=false; 
    } 

    template <class t> 
    int P<t>::getItem() 
    { 
     if(!visited) 
      it=m.begin(); 
     int i=it->first; 
     it++; 
     return i; 
    } 

方法「getItem()」僅在沒有更多地圖更改後調用。所以不應該有迭代器無效的原因。我通過調用m [i] = p將項添加到地圖中。

感謝所有幫助;)

+0

這就是全部? 'visited'初始化爲'false'?你如何將元素添加到'map'?你確定'迭代器'仍然有效嗎? –

+0

在P'visited'的構造函數中設置爲'false'。我通過調用'm [i] = p'來爲地圖添加元素,以獲得從不爲'0'和有效類對象'p'的有效整數。在將所有元素添加到地圖後,我調用該函數,以便在調用方法時不更改它。是否有任何其他原因,爲什麼迭代器不能再有效? – Heusi

+0

你好,歡迎來到SO!在這樣的奧祕中,我們經常發現錯誤出現在您*不*發佈的代碼中,而不是您所做的代碼中。 (畢竟,如果你知道錯誤在哪裏,你不會在這裏,是嗎?)請將你的原始程序減少到最小的** complete **程序,以顯示錯誤(通常20行左右)。然後將該**整個程序複製粘貼到問題中。請參閱http://sscce.org獲取更多信息。 –

回答

0

你不設置「訪問」布爾值,因此,如果你通過一個循環,這使得「的getItem」跑,你總是重新初始化迭代器「它」。

+0

對不起,我沒有提到它,但有一個構造函數,其中'visited'被設置。我將編輯我的帖子;) – Heusi

+0

我認爲布爾值的默認值是「false」。所以即使您已經訪問過您的數據結構,您也不會將其設置爲 。 因此每次調用getItem都會返回第一個索引。但是,你確定你從不在某處寫m [0]嗎?你能添加一些代碼來顯示這個類的用法嗎? – Enki

0

既然你不設置visitedtrue在任何時候,你總是返回map這大概是0第一項的整數。你可能意思是這樣的:

if(!visited) 
{ 
    visited = true; 
    it=m.begin(); 
}