2012-04-30 3 views
7

클래스를 boost::lexical_cast으로 사용하고 싶습니다. operator<<operator>>을 오버로드했지만 런타임 오류가 발생합니다.
여기 내 코드입니다 :
C++ boost :: lexical_cast 클래스 사용하기

#include <iostream> 
#include <boost/lexical_cast.hpp> 
using namespace std; 

class Test { 
    int a, b; 
public: 
    Test() { } 
    Test(const Test &test) { 
     a = test.a; 
     b = test.b; 
    } 
    ~Test() { } 

    void print() { 
     cout << "A = " << a << endl; 
     cout << "B = " << b << endl; 
    } 

    friend istream& operator>> (istream &input, Test &test) { 
     input >> test.a >> test.b; 
     return input; 
    } 

    friend ostream& operator<< (ostream &output, const Test &test) { 
     output << test.a << test.b; 
     return output; 
    } 
}; 

int main() { 
    try { 
     Test test = boost::lexical_cast<Test>("10 2"); 
    } catch(std::exception &e) { 
     cout << e.what() << endl; 
    } 
    return 0; 
} 

출력 :

bad lexical cast: source type value could not be interpreted as target 


가 Btw은 내가 비주얼 스튜디오 2010을 사용하고 있습니다하지만 g와 페도라 16를 시도 ++와 같은 결과를 가지고있어!

+0

재미있는 질문은, 지금까지 진짜 대답을 찾을 수 없습니다. 스트림에 문제가있는 것처럼 보입니다. 1. 스트림 연산자에 들어갈 때만 업데이트됩니다. b는 그렇지 않습니다. 공백이 심하게 해석되었지만 문자열이 업데이트되지 않았는지 확인하기 위해 다른 문자열을 추가했습니다. 2. 당신이 통신 수에서 나올 때 던져서, 내가 이해하지 못하는 것을 검사 한 후 던지기로 결정합니다. – Klaim

+0

아마도 기본 생성자, 복사 생성자 및 소멸자의 기본 버전을 스스로 정의하는 대신 사용해야합니다. 컴파일러가 대신 생성자를 생성합니다 (복사 생성자의 경우 더 정확하게 수행합니다 ([this faq ] (http://stackoverflow.com/q/4172722/20984). –

답변

7

boost::lexical_cast은 입력에서 공백을 무시하지 않으므로 (입력 스트림의 skipws 플래그를 설정 해제합니다) 문제가 발생합니다.

해결 방법은 추출 연산자에서 플래그를 직접 설정하거나 한 문자를 건너 뛰는 것입니다. 실제로 추출 연산자는 삽입 연산자를 반영해야합니다. Test 인스턴스를 출력 할 때 명시 적으로 공백을 넣으므로 인스턴스를 추출 할 때 공백을 명시 적으로 읽어야합니다.

This thread

주제를 설명하고 권장되는 솔루션은 다음을 수행하는 것입니다

friend std::istream& operator>>(std::istream &input, Test &test) 
{ 
    input >> test.a; 
    if((input.flags() & std::ios_base::skipws) == 0) 
    { 
     char whitespace; 
     input >> whitespace; 
    } 
    return input >> test.b; 
} 
+0

+1 : 방금 무슨 일이 일어나고 있었는지 검색 한 후 10 분이 지났습니다. – Klaim

+0

감사합니다! 방금 boost :: lexical_cast ("123")이 같은 예외를 던졌습니다. –

+0

이 질문은 부스트 ​​포럼에서 상세히 논의되었습니다. [이 스레드] (http : //lists.boost. org/Archives/boost/2005/01/79275.php)은 이와 관련하여 매우 흥미 롭습니다. –