2

良い一日です、

私の物はそれほど良くないように見えるからです。

私はクラスCを持っていますが、これには子はありませんが、別のクラスのインスタンスへのポインターで作成されたベクトルがあります。これをBと呼びましょう。

class C
{
    public:
       ...
       std::vector<B*> elements;
       ...
}

Bには、別のクラスのインスタンスへのポインターのベクトルもあります。これをAと呼びましょう。

class B
{
    public:
       ...
       std::vector<A*> elements2;
       ...
}

Cには、elementsとelements2の要素を反復処理するメソッドがあり、次のように機能します。

std::vector<B*>::iterator it1;
std::vector<A*>::iterator it2;

for (it1=this->elements.begin(); it1!=this->elements.end(); ++it1)
{
    for (it2 = it1->elements2.begin(); it12=it1->elements2.end(); ++it2)
    {
        it2->do_something(); //method of class A
    }
}

しかし、コンパイラ(g ++)は、(クラス階層)のoperator!=に一致するものがないと私に言い続けます。

誰かが私が間違ったことを知っていますか?'<'のような他の演算子も機能しないようです。

私は初心者ではありませんが、C ++(元Pythonプログラマー)でイテレーターを使用するのは初めてであり、コードの何が問題になっているのかを実際に理解することはできません。

事前に助けてくれてありがとう、私はこれで髪を失っています!

編集:参照用にエラー全体を追加しています。私は質問に合うようにそれを編集しました、私は何も台無しにしないことを望みます:

'it1!=((C *)this)-> C :: elements.std :: vector <_Tp、_Alloc> :: end with _Tp = B *、_Alloc = std::の'operator!='に一致しませんアロケータ'</p>

4

4 に答える 4

4

これを試してください:

std::vector<B*>::iterator it1;
std::vector<A*>::iterator it2;

for (it1=this->elements.begin(); it1 != this->elements.end(); ++it1)
{
    for (it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2)
    {
        (*it2)->do_something(); //method of class A
    }
}
  • 内側のループで、 (型の) と(it1型の) を比較しようとしたため、コンパイラが文句を言うのは正しいことです。std::vector<B*>::iteratorit1->elements2.end()std::vector<A*>::iterator
  • it2type の要素に「到達」するには、イテレータを逆参照する必要がありますA*(*it2)->do_something()

余談ですが、既存のコードを改善する方法はおそらくいくつかありますが、いくつかだけ述べます。

  • 私は使用を避けますthis->
  • typedefイテレータを含むコードを明確にするために使用します
  • it1andit2がループ外で使用されていない場合は、その範囲を狭めます

あなたは書くことができます(明らかに、ベクトル化されたtypedef名前はより意味のあるはずです):

typedef std::vector<A*> vector_of_A;
typedef std::vector<B*> vector_of_B;
for (vector_of_B::iterator it1 = elements.begin(), end1 = elements.end(); it1 != end1; ++it1)
{
    vector_of_A &innerVector = (*it1)->elements2;
    for (vector_of_A::iterator it2 = innerVector.begin(), end2 = innerVector.end(); it2 != end2; ++it2)
    {
        /* ... */
    }
}
于 2010-11-22T11:58:37.933 に答える
1

これはコンパイルする必要があります:

std::vector<B*>::iterator it1;
std::vector<A*>::iterator it2;

for (it1 = elements.begin(); it1 != elements.end(); ++it1)
{
    for (it2 = elements2.begin(); it2 != elements2.end(); ++it2)
    {
        it2->do_something(); //method of class A
    }
}

でも本当は何がしたいのかわからない。

于 2010-11-22T12:01:35.943 に答える
1

ポインタへのベクトルがあります。そのため、そのポインターで関数を呼び出すには、最初にイテレーターを逆参照して (ポインターを取得する)、その上で関数を呼び出す必要があります。

for ( it1 = elements.begin(); it1 != elements.end(); ++it1)
{
    for (it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2)
    {
        (*it2)->do_something(); //method of class A
    }
}

編集:問題は別の場所にあると思います。次のコードは、VS2008 および VS2010 で正常にコンパイルされます。

class A
{
public:
    void Fn()
    {
    }
};

class B
{
    public:
       std::vector<A*> elements2;
};

class C
{
    public:
       std::vector<B*> elements;

    void Fn()
    {
        std::vector< B* >::iterator it1;
        std::vector< A* >::iterator it2;

        for ( it1 = elements.begin(); it1 != elements.end(); ++it1 )
        {
            for ( it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2 )
            {
                (*it2)->Fn();
            }
        }
    }
};
于 2010-11-22T12:10:44.673 に答える
0

次のコードは、Linux の gcc 4.2.0 で動作します。どのバージョンを使用していますか?
おそらく、クラスを宣言する順序またはその他の問題です。

#include <vector>


class A;
class B;
class C;

class A {
  public:
    void do_something() {};
};
class B
{
  public:
    std::vector<A*> elements2;
};


class C
{
  public:
    std::vector<B*> elements;

    void do_this() {
      std::vector<B*>::iterator it1;
      std::vector<A*>::iterator it2;

      for (it1=this->elements.begin(); it1!=this->elements.end(); ++it1)
      {
        for (it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2)
        {
          (*it2)->do_something(); //method of class A
        }
      }
    };
};

int main() {
  C c;
};

~
~

于 2010-11-22T12:33:05.167 に答える