2012-04-30 25 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 

ところで私は、Visual Studio 2010を使用しています。しかし、私はグラムでのFedora 16を試してみました++と同じ結果を持っています!

+0

興味深い質問を、これまでの本当の答えを見つけることができません。ストリームに何か問題があるように見えます:1.ストリーム演算子に入ると、更新されるだけです.bは更新されません。スペースがひどく解釈されたかどうかをチェックするために別の文字列を追加しましたが、文字列も更新されませんでした。 2.オペレーターから出るときにスローし、私が理解できないものをチェックして投げようとする。 – Klaim

+0

おそらくデフォルトのコンストラクタであるコピーコンストラクタとデストラクタを自分で定義するのではなく、デフォルトのコンストラクタを使うべきです:コンパイラはそれらを生成します(コンストラクタをコピーする場合はもっと正確に行います(see this faq ](http://stackoverflow.com/q/4172722/20984)) –

答えて

7

boost::lexical_castは、入力の空白を無視しない(入力ストリームのskipwsフラグを解除します)という事実に由来します。

解決策は、抽出演算子でフラグを自分で設定するか、1文字をスキップすることです。実際には、抽出演算子は挿入演算子をミラーリングする必要があります。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

この質問はBoostフォーラムで議論されています。 org/Archives/boost/2005/01/79275.php)はこの点でかなり面白いです。 –

関連する問題