2010-11-22 5 views
2

좋은 하루 경이, 내게 그렇게 좋지 않기 때문에 좋은 하루 경,문제 C++ STD Iterator 비교 연산자

입니다.

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

B는 포인터의 벡터에 있습니다

내가 자식을 가지고 있지만 다른 클래스의 인스턴스에 대한 포인터로 만들어진 벡터를 가지고하지 않는 클래스 C를 가지고,의는 B를 부르 자 다른 클래스의 인스턴스는, 이제 그것을 부르 자 :

C는 다음과 같이 작동 요소와 요소 2의 요소를 반복하고, 방법이
class B 
{ 
    public: 
     ... 
     std::vector<A*> 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! = in (클래스 계층 구조)과 일치하는 것을 계속 유지합니다.

내가 뭘 잘못했는지 아는 사람 있습니까? '<'과 같은 다른 연산자는 작동하지 않습니다.

저는 초보자가 아니지만 C++ (전 파이썬 프로그래머)에서 반복자를 사용하기 시작한 것이므로 코드에 무엇이 잘못되었는지를 알 수 없습니다.

사전에 도움을 주셔서 감사합니다, 나는 이걸로 내 머리를 잃고 있어요!

편집 : 참조를 위해 전체 오류를 추가하고 있습니다. 나는 그 질문에 맞도록 편집했는데, 나는 아무것도 망쳐 놓지 않았 으면 좋겠다 :

'it1! = ((C *) this) -> C :: elements .std : 벡터 <는 _Tp, _Tp = B *를 _Alloc = 표준 : : 할당 '와 _Alloc> :: 끝

답변

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 (유형 :)을 비교하려고 시도했습니다. it1->elements2.end() (유형이 std::vector<A*>::iterator)이므로 컴파일러는 불평 할 권리가 있습니다.보조 노트에 (*it2)->do_something()

, 기존의 코드를 개선하기 위해 아마 여러 가지 방법이 있습니다,하지만 난 단지를 두자

  • 유형 A*의 요소 '범위'에 대한 반복자 it2 역 참조에 당신이 몇 :

    • 내가 코드를 포함하는 반복자
    • I를 명확히 this->
    • 사용 typedef을 사용하지 않는 것 F it1it2, 당신은 쓸 수

    자신의 범위를 좁힐 루프 외부에서 사용되지 않습니다 (분명히 벡터 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) 
        { 
         /* ... */ 
        } 
    } 
    
  • +0


    , 미안 해요. it1 (inner loop)은 당연히 it2라고 생각했습니다. 아직 컴파일되지 않습니다. 편집 : 나는 내부 루프 전에 컴파일러 오류를 실제로 외부 및 내부 루프 모두 얻을. – Percival

    +0

    @Percival : 대답 편집 – icecrime

    +0

    벡터의 끝을위한 반복자를 생성하면 분명히 연산자 문제가 종료되지만 분명히 다른 문제가 나타납니다 (아마도 내 잘못). 나는 그 원인이 무엇인지 궁금해. 다른 오류를 수정하려고합니다. 그 때까지 이것이 가장 유효한 대답입니다. 감사! 편집 : 완벽하게 작동합니다. 우수 답변! – Percival

    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 
        } 
    } 
    

    그러나 나는 당신이 정말로하고 싶은 것을 모른다.

    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(); 
          } 
         } 
        } 
    }; 
    
    +0

    이것이 예상치 못한 문제를 해결했다고 생각합니다. 고마워요! 그러나 운영자의 문제는 여전히 남아 있으므로 답변이 도움이되고 유효한 경우에도 (그리고 많은 문제가 저장되어 있어도) 문제는 여전히 해결되지 않습니다. – Percival

    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; 
    }; 
    

    는 ~ 오타했다 ~