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(of type std::vector<B*>::iterator) 与it1->elements2.end()(of type std::vector<A*>::iterator) 进行比较,因此编译器抱怨是正确的。
  • 您必须取消引用迭代器it2才能“到达”类型的元素A*(*it2)->do_something()

附带说明一下,可能有几种方法可以改进您现有的代码,但我只会说明一些:

  • 我会避免使用this->
  • 用于typedef阐明涉及迭代器的代码
  • 如果it1并且it2不在循环外使用,则缩小其范围

您可以编写(显然,vectortypedef的名称应该更有意义):

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 回答