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;
}