2011-12-22 110 views
0

我目前正在嘗試構建自定義類的迭代器,但它不會特別好:我遇到的問題是我的自定義類使用模板,看起來像這樣:自定義迭代器模板

現在
template<class T> 
class MyClass { 
private: 
    T memberVar; 
}; 

,MyClass的基本上是memberVar的包裝這在目前是一個地圖或一個地圖。現在,我想在另一個類中創建一個迭代器,並對它做有用的事情,即訪問我的地圖或地圖地圖中的元素。

我已經試過我的地圖上,不給我一個MyClass的錯誤時,我這樣做typedef T::iterator iterator;轉發我的迭代器,但它顯然並不想對我好時,我想打電話給myIterator->first,因爲現在它不相信我會這麼做。說實話,我很驚訝地發現我的typedef確實有效。

現在我的問題:是否有一個很好的辦法做到我想做的是什麼?還是我在這裏把自己調到了一個角落?首先十分感謝!

西蒙

一些詳細信息:

在我的ClassA實例化一個ClassB的,然後用正確的類型T. 繼承MyClass的。然後,在我的ClassA也實例化一個ClassC我給一個參考ClassB的。現在,錯誤發生,當我嘗試在ClassC中創建myIterator並嘗試執行myIterator->first時。

+1

你不需要'的typedef typename的T ::迭代器iterator'?我很驚訝,你說你沒有得到'typedef T :: iterator iterator'的錯誤。 – atkins 2011-12-22 17:08:25

+0

這看起來更好,你是對的,但我沒有得到一個錯誤。如果有人能解釋這是爲什麼會很好。 另外:現在,我已經決定簡單地使用'地圖',從此我可以訪問的元素,並在那一刻,我只有地圖。這是,我覺得,雖然相當醜陋,我會很感激任何更好的解決方案:) – simonstuck 2011-12-22 17:25:01

+0

他應該得到一個錯誤,沒有'typename',但不是所有的編譯器強制執行此。 – 2011-12-22 17:27:13

回答

1

對於初學者來說,如果你的類模板總是將成爲 的map一些實例,我要重複所有的typedef S在 std::map在你的類的包裝,每個時間:

typedef typename T::value_type; 
// ... 

(該typename是必要的,至少根據標準,但 版的g ++以及編譯所有與它的代碼,即使你使用 不同的編譯器的最終版本。)

至於到myIterator->first不工作,你必須告訴我 這個地方發生行。應該沒有問題,如果它是在你的類模板 功能,因爲該功能不應該 實例化,直到它被使用(並通過這種類型的T類型是 知道)。如果它是類模板之外,它應該仍然工作, 提供您正確地聲明的變量,像:

MyClass<std::map<T1, T2> >::iterator myIterator; 

(在類模板,只是用iterator的類型名稱應該 足矣,由於typedef在範圍內)。

+0

好的,非常感謝!我在第一篇文章中添加了更多信息。 – simonstuck 2011-12-22 17:45:47