0

ベクターに対してイテレーター クラスを定義したいのですが、そのプライベート メンバーpを std::vector::begin() の戻り値の型と一致させるにはどうすればよいですか?

class A{

struct element{
      ...
}

  class e_iterator {

  e_iterator() : p()

    ...

    private:
      element* p;  
  };

  e_iterator e_begin() const{
     e_iterator Iter;
     Iter.p = e_.begin(); // error
     return Iter;
  }

 std::vector<element> e_; 

次のエラーが表示されelement* pます。

error: cannot convert 'std::vector<element, std::allocator<element>>::const_iterator' to 'element*' in assignment
4

2 に答える 2

1

イテレータクラスでに変更element* pするかconst element* p、e_begin()メソッドからconst修飾子を削除します。または、const/non-constイテレータの両方を提供します。また、イテレーターコンストラクターでポインターを初期化することをお勧めします。

template <bool isconst>
class e_iterator_ {

  public:
    typedef std::conditional<isconst, const element*, element*>::type elementptr;

    e_iterator_(elementptr e) : p(e)

  ...

  private:
    elementptr p;  
};

typedef e_iterator_<true> const_e_iterator;
typedef e_iterator_<false> e_iterator;

次にdata()、std :: vectorのmemberメソッドを使用して、ベクトルの基になる配列に直接アクセスできます。

  e_iterator e_begin() const{
     const_e_iterator Iter(e_.data());
     return Iter;
  }

お役に立てれば。

于 2013-03-10T20:48:45.263 に答える
1

あなたが与えたもので、私が提案できるのは、次のように変更pすることです。

std::vector<element>::const_iterator p;

単純な事実として、std::vector反復子は (おそらく) ポインターではありません。これは、ポインターのように動作する未指定の型であり、ランダム アクセス反復子の要件を満たしています。

begin()constコンテナを呼び出すと、iteratorタイプが取得されます。constイテレータで呼び出すと、const_iterator型が取得されます。a_beginメンバー関数はマークされconstており、クラスe_のメンバーのように見えるため、は推移的に であるため、それを呼び出すと も取得されます。std::vector<element>e_constbegin()const_iterator

しかし、ここで何をしようとしているのか、またこれが正しい方法なのかを正確に判断するのは非常に困難です。

于 2013-03-10T20:13:03.647 に答える