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

您應該使用默認構造函數的默認版本,複製構造函數和析構函數,而不是自己定義它們:編譯器會爲您生成它們(並且在複製構造函數時會更加正確)(請參閱[this faq ](http://stackoverflow.com/q/4172722/20984))。 –

回答

7

您的問題來自於boost::lexical_cast不會忽略輸入中的空白(它取消輸入流的skipws標誌)。

解決的辦法是在提取操作符中自己設置標誌,或者只跳過一個字符。事實上,提取操作符應該映射插入操作符:因爲在輸出實例時顯式地放置空間,所以在提取實例時應明確讀取空間。

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論壇上詳細討論過了[This thread](http://lists.boost。 org/Archives/boost/2005/01/79275.php)在這方面非常有趣。 –

相關問題