2011-03-12 6 views
0

boost :: exception이 포함되어있을 때 2 레벨 변형 구조체에 이상한 문제가 있습니다.boost :: except와 boost :: variant의 문제

boost/exception/detail/is_output_streamable.hpp(45): error C2593: 'operator <<' is ambiguous 
test.cpp(11): could be 'std::ostream &operator <<(std::ostream &,const ExpressionItem &)' [found using argument-dependent lookup] 
test.cpp(8): or  'std::ostream &operator <<(std::ostream &,const StoredValue &)' [found using argument-dependent lookup] 
1> while trying to match the argument list '(std::basic_ostream<_Elem,_Traits>, const boost::error_info<Tag,T>)' 
1> with 
1> [ 
1> _Elem=char, 
1> _Traits=std::char_traits<char> 
1> ] 
1> and 
1> [ 
1>  Tag=boost::tag_original_exception_type, 
1>  T=const type_info * 
1> ] 

코드가 실제 코드 구조는 훨씬 더 복잡하며, 가능한 한 단순화 : 나는 오류

#include <boost/variant.hpp> 
#include <boost/exception/all.hpp> 

typedef boost::variant<int> StoredValue; 
typedef boost::variant<StoredValue> ExpressionItem; 
inline std::ostream& operator << (std::ostream & os, const StoredValue& stvalue) { return os;} 
inline std::ostream& operator << (std::ostream & os, const ExpressionItem& stvalue) { return os; } 

나는 그것을 컴파일하려고

다음 있습니다 : 나는 코드를 다음 한 각 변형에는 다섯 가지 하위 유형이 있습니다.

내가 제거하면 #INCLUDE 부스트/예외/테스트 미리보기 다음 모든 시도, 프로그램이 제대로 컴파일 : 사용하는 경우에도 작동하기 위해서는 사업자 < <을 정의하는 방법을

void TestVariant() 
{ 
    ExpressionItem test; 
    std::stringstream str; 
    str << test; 
} 

은 누군가가 나에게 조언을 주 시겠어요 부스트 :: 예외? 나는 그것을 생각하지 않는다

감사와 관련

+0

나는 boost :: exception과 아무 관계가 없다고 생각한다. 그것은 출력 스트림 "operator <<"입니다. 그러나 당신이 그것을 사용하는 것처럼 변형을 사용하지 않았습니다. 나는 이것이 "스테로이드 위주의 조합"인데 적어도 2 가지 타입이 있어야한다고 생각했지만 암묵적으로 뭔가있을 수 있습니다 ... 나는 문서를 다시 방문 할 것입니다. – celavek

+0

하나의 유형은 단지 예시 목적입니다. 내 실제 코드에는 각 변형이 다섯 가지 하위 유형이 있습니다. boost :: except가 없으면 모든 것이 제대로 작동합니다. – Rick

+0

코드가 부스트 네임 스페이스 안에 있습니까? 출력 스트림 연산자가 예외에 대해 정의 된 것과 충돌한다고 생각합니다. 자신의 네임 스페이스에 코드를 삽입 해보십시오. – celavek

답변

0

부스트 :: 제외하고는 아무 상관이있다. 출력 스트림 "operator < <"입니다. 그러나 당신이 그것을 사용하는 것처럼 변형을 사용하지 않았습니다. 나는 이것이 "스테로이드 위주의 조합"인데 적어도 2 가지 타입이 있어야한다고 생각했지만 암묵적으로 뭔가있을 수 있습니다 ... 나는 문서를 다시 방문 할 것입니다.

코드가 부스트 네임 스페이스 안에 있습니까? 출력 스트림 연산자가 예외에 대해 정의 된 것과 충돌한다고 생각합니다. 자신의 네임 스페이스에 코드를 삽입 해보십시오.

여전히 잘못된 따기의 문제가 될 수있는 실행되지 운영자에 관해서 ... 당신이 표준와 마찬가지로 네임 스페이스 해상도 연산자를 앞에하여 "< <"연산자를 사용하려고 :: stringstream.

편집 :로 업 마지막 코멘트에 따라 : 당신의이 필요할 때 하는 myNameSpace 다음 명시 적 버전을 사용하는 말을하자, 자신의 네임 스페이스에있는 당신의 연산자를 정의 할 수 있습니다, 예를 들어,

void TestVariant() 
{ 
    using namespace mynamespace; 

    ExpressionItem test; 
    std::stringstream str; 
    str << test; 
} 

그것은 위의 예를 언급 작동하지만 난 그 잘 모르겠어요;의 당신이 직면하고있는 정확한 상황 ... 그리고 나는 정신에 익숙하지 않다

+0

캡슐 내 연산자 << 네임 스페이스를 사용하고 네임 스페이스 접두사를 사용하여 호출하는 것은 절대적으로 솔루션입니다. 그러나 연산자 << 변형을 사용해야하는 기존 라이브러리에서는 접두어를 사용할 수 없습니다. 이것이 연산자 <<를 전역 네임 스페이스에 정의해야하는 이유입니다. 감사. – Rick

+0

나는 완전히 이해한다고 생각하지 않는다. 운영자가 기존 라이브러리에서 사용 가능하도록하고 표준 라이브러리 대신 사용할 수 있도록 하시겠습니까? 이미 제작되어 출하 된 도서관 에서처럼? – celavek

+0

예를 들어 boost spirit 라이브러리. 내가 문법에 내 자신의 구조체/변종을 사용하고 있습니다. 그리고 디버깅 (현재 구문 분석 트리를 표시)하기 위해 구조의 내용을 표시해야합니다. 이것은 통과 된 모든 구조에 boperator <<를 사용하는 내부 정신 메커니즘을 사용하여 수행됩니다. 그래서 어떤 네임 스페이스 나 다른 해킹을 사용할 수 없지만이 연산자를 전역 네임 스페이스에 넣어야합니다. boost :: except가 포함되지 않을 때까지이 모든 작업은 정상적으로 작동합니다. 그래서 문제가있을 것입니다. – Rick

관련 문제