2012-08-14 74 views
0

我想創建一個支持迭代器的自定義容器。它看起來像這樣:Boost iterator_facade和轉發聲明

class SomeContainer { 
    ... 
public: 
    typedef SomeIterator iterator; 
    iterator begin() { ... } 
    iterator end() { ... } 
}; 

然後,我創建一個迭代器這樣的:

class SomeIterator: public boost::iterator_facade< 
     SomeIterator, 
     SomeType, 
     boost::bidirectional_traversal_tag> { 
    ... 
} 

的問題,這是下面的。如果我在SomeiIterator之前聲明並且正向聲明SomeIterator,那麼編譯器會抱怨SomeIterator是不完整類型的方法begin()end()。但是,如果我以另一種方式進行操作,那麼問題就出現了:SomeContainer不完整。

  1. 是否有可能同時具有這兩個類全頭,只和所有方法隱含的內聯(它們大多隻包含幾行)來解決這個問題呢?
  2. 如果沒有,是否可以通過將一些方法分解爲cpp文件來解決它?

回答

1

它可以部分地滿足您的第一個要求,因爲你可以除了beginend,將需要申報inlineSomeContainer定義之外定義,並在標題定義一切SomeIterator定義後(完成類型)。這假定你保持目前的定義順序(SomeContainer之前SomeIterator),我建議你保持。否則,您肯定可以溝通inline(隱式或其他方式)並在類定義之外進行定義。通過這樣做,這兩種類型將從這些定義中完成。

+0

哎呦,我錯打了它。模板參數分別是SomeIterator和SomeContainer。 – petersohn 2012-08-14 19:25:48