0

イテレータをサポートするカスタムコンテナを作成したいと思います。次のようになります。

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

次に、このためのイテレータを作成します。

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

これに伴う問題は次のとおりです。SomeContainerbeforeSomeiIteratorとforwarddeclareを宣言するとSomeIterator、コンパイラはstbegin()end()メソッドSomeIteratorが不完全な型であると文句を言います。しかし、私がそれを逆にすると、問題は逆になります:SomeContainer不完全です。

  1. 両方のクラスを完全にヘッダーのみにし、すべてのメソッドを暗黙的にインライン(ほとんどの場合、数行しか含まない)にして、この問題を解決することは可能ですか?
  2. そうでない場合、いくつかのメソッドをcppファイルに分解することでそれを解決することは可能ですか?
4

1 に答える 1

1

最初の要件を部分的に満たすことができます。これは、定義の外部、および定義(型を完成させる)の後に宣言および定義する必要があるものを除いbeginて、ヘッダー内のすべてを定義できます。これは、現在の定義の順序(前)を維持することを前提としています。これを維持することをお勧めします。endinlineSomeContainerSomeIteratorSomeContainerSomeIterator

そうでなければ、あなたは確かにinline(暗黙的であろうとなかろうと)捨てて、クラス定義の外で定義することができます。そうすることで、両方のタイプがそれらの定義から完成します。

于 2012-08-14T19:09:57.443 に答える