C++ Использование классов с boost::lexical_cast

Я хочу использовать свой тестовый класс с boost::lexical_cast, Я перегружен operator<< а также operator>> но это дает мне ошибку во время выполнения.
Вот мой код:

#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 с g++ и получил тот же результат!

1 ответ

Решение

Ваша проблема связана с тем, что boost::lexical_cast не игнорирует пробелы во входных данных (это сбрасывает skipws флаг входного потока).

Решение состоит в том, чтобы либо установить флаг самостоятельно в своем операторе извлечения, либо просто пропустить один символ. Действительно, оператор извлечения должен отражать оператор вставки: так как вы явно ставите пробел при выводе Test экземпляр, вы должны явно прочитать пространство при извлечении экземпляра.

В этой теме обсуждается тема, и рекомендуемое решение заключается в следующем:

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;
} 
Другие вопросы по тегам