2009-04-14 3 views
1
typedef boost::variant<long long,double,string> possibleTypes ; 

set<possibleTypes,less<possibleTypes> > ascSet ; 
set<possibleTypes,greater<possibleTypes> > descSet ; 

컴파일하려고하면 일부 라이브러리 헤더에 오류가 발생합니다.
그러나 세 번째 줄 (descSet이있는 줄)을 제거하면 코드가 올바르게 컴파일됩니다.std :: boost :: variant 요소로 채워지는 설정은 하위 클래스로 정렬 될 수 없습니까?

무엇이 문제입니까? boost :: variant 개체를 하위 순서로 정렬 할 수 있습니까 ??

편집 :
내가 비주얼 스튜디오 2005를 사용하고 1.38.0 부스트있어 다음과 같은 명령 행 :이 더그 T에 의해 제안 된 것처럼

cl /EHsc /I"C:\boost_1_38_0" test.cpp 

Edit2가 , 만약 I 이 정의

bool operator>(const possibleTypes& a, const possibleTypes& b){ 
    return b < a ; 
} 

그런 다음, 다음 코드는 컴파일되지 않습니다 :

possibleTypes pt1="a", pt2="b" ; 
greater<possibleTypes> func ; 
cout << func(pt1,pt2) << endl ; 

그러나,이 코드는 잘 컴파일 :

possibleTypes pt1="a", pt2="b" ; 
cout << (pt1 > pt2) << endl ; 

사람이 이유를 이해하는 데 도움이 수?

나는> 연산자를 :: < 운영자가 부스트에 대해 정의 된 변형을 표시하지만 VC++ 2005와 GCC 3.4.6

+0

어떤 버전의 Boost를 사용하고 있습니까? 방금 1.38.0 및 VC++ 9.0 코드를 사용해 보았지만 문제없이 컴파일되었습니다. – Ferruccio

+0

정말요? 그것은 복사기 버전이어야합니다 (방금 내 게시물을 업데이트했습니다) – GetFree

+0

적어도 첫 번째 오류 메시지를 제공 할 수 있습니까? 나는. descSet의 결과가 부적절하게 정의 된 것이 아니라 선언 자체에 관한 것. – MSalters

답변

0

는이 제안되면서

possibleTypes pt1="a", pt2="b" ; 
greater<possibleTypes> func ; 
cout << func(pt1,pt2) << endl ; 

그러나,이 코드는 잘 컴파일 :

possibleTypes pt1="a", pt2="b" ; 
cout << (pt1 > pt2) << endl ; 

아무도 나를 이해하는 데 도움이 될 수 있습니까 ??

VC++ 2005 및 GCC를 사용해 보았습니다. 3.4.6

+1

네임 스페이스 부스트 : 네임 스페이스 부스트 {bool 연산자> (const 가능 유형 및, const 가능 유형 및 b) ...} . 컴파일러는 연산자에 대한 잘못된 위치를 찾고 있습니다.> 개인적으로 두 개의 가능한 형식 인수를 취하는 연산자를 찾습니다. –

+1

아니요 - 인수 별 조회입니다. 그것은 어디에서나 검색 할 것이 아니라, 호출자의 네임 스페이스 (std :: greater)와 인수의 네임 스페이스 (boost :: variant)를 조사합니다. 두 번째 경우 호출자의 네임 스페이스는 전역 네임 스페이스 (아마도)입니다. – MSalters

+0

고마워, 맥스. 부스트 네임 스페이스에 operator>를 추가하는 문제가 수정되었습니다. 규칙을 명확히하기 위해 MSalters에게 감사드립니다. – GetFree

3

로했습니다. 따라서 아마 표준 : <> 작품 적은 있지만 수 std하지 :: 큰 <>

here

나는 자유> 연산자를 정의하려고 할 것를 참조하십시오.

bool operator > (boost::variant<...> lhs, boost::variant<..> rhs) 
{ 
    return (rhs < lhs) // thanks Chris Jester Young 
} 
+0

왜 그냥 : return rhs

+0

그래, 간단하지 않을거야 :) –

1

더 큰 연산자를 사용해야합니다. 가능 유형에 제공되지 않는 경우 Doug과 같이 무료 것으로 정의하거나 Boost operators을 사용해보세요. 그런 다음

bool operator>(const possibleTypes& a, const possibleTypes& b){ 
    return b < a ; 
} 

다음 코드는 컴파일되지 않습니다 :이 정의하는 경우