2009-04-04 4 views
4

다음 사람이 VC9에서 오류를 생성하는 이유를 알고 있습니까?BOOST_FOREACH : STL 컨테이너를 사용할 때의 오류는 무엇입니까?

class Elem; 
class ElemVec : public vector<Elem> 
{ 
    public: 
     void foo(); 
}; 

void ElemVec::foo() 
{ 
    BOOST_FOREACH(Elem& elem, *this) 
    { 
     // Do something with elem 
    } 
    return; 
} 

내가 오류는 다음과 같습니다 오류없이

error C2355: 'this' : can only be referenced inside non-static member functions 

내가 지금 컴파일 한 유일한 (해킹) 솔루션입니다 :

void ElemVec::foo() 
{ 
    ElemVec* This = this; 
    BOOST_FOREACH(Elem& elem, *This) 
    { 
     // Do something with elem 
    } 
    return; 
} 

답변

1

어떤 컴파일러/부스트 버전을 사용하고 있습니까? 당신이 세부 사항을 더 원하는 경우

#include <boost/foreach.hpp> 
using namespace std; 
struct xxx : std::vector<int> 
{ 
    void test() 
    { 
     BOOST_FOREACH(int x, *this) 
     { 
     } 
    } 
}; 

int main(void) { 
    xxx x; 
    x.test(); 
    return 0; 
} 

가 부스트 bugbase 검색 : 어떤 문제 (VS2005/1.38 부스트)없이 다음을 컴파일 할 수 있습니다.

+0

그 점을 지적 해 주셔서 감사합니다. 나는 Boost 1.35에있어, 나는 1.38로 업그레이드 할 것이고 당신에게 돌아갈 것이다. –

+0

부스트 1.38에서 오류가 사라졌습니다. 고마워요! :-) –

0

그 오류를 본 적이 없었다. BOOST_FOREACH 매크로 구현에서 오는 것 같아요.

왜 벡터 < ...>에 기반한 클래스를 만들고 벡터 멤버 변수가 없는지 물어볼 수 있습니까?

편집this thread에 따라,이 실제로 비주얼 스튜디오 버그가 있음을 발견했다. 당신이 찾은 해결책은 가장 단순한 것 같습니다.

+0

이 경우, 내가 필요로하는 일부 추가 기능으로 벡터 을 확장하려고합니다. –

+0

일반적으로 나쁜 생각 - 상속을 사용하는 대신 자유 함수를 작성하십시오. –

+0

벡터에서 상속하는 것은 일반적으로 비상 가상 소멸자이기 때문에 좋지 않습니다. 이 사실을 알고있는 한 확장은 괜찮을 것입니다. – Indy9000

4

STL 컨테이너를 상속하면 안됩니다. 이것은 다형성 클래스가 아니며 BOOST_FORACH이 파생 클래스를 처리 할 수없는 이유입니다.

대신 집계를 사용해보십시오.

+1

BOOST_FOREACH가 그러한 클래스에 적용되지 못하게하는 것은 무엇입니까? –

0

흠, 모두 내 msvc (2005) 컴파일러에서 성공적으로 컴파일되었습니다.

어쩌면 당신은 약간의 오류가 있지만, 당신의 예가 만들어 졌을 때 그것을 고치거나 피할 수도 있습니다.

+0

"dirkgently"지적한 바와 같이, 그것은 부스트 ​​문제로 밝혀졌습니다. 오류는 더 이상 최신 Boost v1.38에서 발생하지 않습니다. –

관련 문제