4

コードの重複を避けるために、const_iteratorクラスとイテレータークラスの両方をカバーできる単一のイテレータークラスを作成しようとしています。

他のいくつかの質問を読んでいるときに、私が欲しい正確な質問をするこの投稿に出くわしました。最高の反応は、私が段落で何をする必要があるかを説明するまともな仕事をするこの記事でしたが、私が持っていない本の例を参照しています。説明されていることを実装するための私の試みは次のとおりです。

      template<bool c=0> //determines if it is a const_iterator or not
      class iterator{
         typedef std::random_access_iterator_tag iterator_category;
         typedef T value_type;
         typedef T value_type;
         typedef std::ptrdiff_t difference_type;
         typedef (c ? (const T*) : (T*)) pointer; //problem line
         typedef (c ? (const T&) : (T&)) reference; //problem line
      public:
         operator iterator<1>(){ return iterator<1>(*this) }
         ...
      }

三項演算子を使用してtypedefを決定する方法がわかりません。指定された行は、コンパイラエラー「expected')' before'?'を取得します。トークン"。記事の解釈が間違っていますか?

また、すべてのconst関数で非constパラメーターを変換できるように、変換コンストラクターを作成するように指示されています。これは、const_iteratorsを使用するときに、プログラムがすべてのパラメーターに対して面倒な新しいイテレーターを作成する必要があることを意味しませんか?それは非常に最適な解決策のようには思えません。

4

1 に答える 1

4

三項演算子は、型ではそのようには機能しません。代わりに使用できますstd::conditional

typedef typename std::conditional<c ,const T*, T*>::type pointer; 
于 2013-03-03T06:18:07.790 に答える