Opened 13 years ago
Closed 13 years ago
#4009 closed Bugs (fixed)
lexical_cast to multimember object fails
| Reported by: | Owned by: | nasonov | |
|---|---|---|---|
| Milestone: | Boost 1.43.0 | Component: | lexical_cast |
| Version: | Boost 1.40.0 | Severity: | Not Applicable |
| Keywords: | Cc: | darko.veberic@… |
Description
According to the documentation, the only relevant requirement for the lexical_cast<target>(source) is that the target is input-streamable. Having a simple class
struct Foo {
int fA;
int fB;
};
with input operator
istream&
operator>>(istream& is, Foo& f)
{
return is >> f.fA >> f.fB;
}
should satisfy all the requirements. Nevertheless, the code
const string s = "137 13"; const Foo f = lexical_cast<Foo>(s);
compiles without any warnings (g++ 4.4.1) but eventually throws a bad_lexical_cast exception. Of course, using a non-optimized non-boost version of the lexical cast
template<typename T, typename U>
T
LexicalCast(const U& u)
{
stringstream ss;
ss << u;
T t;
if (ss >> t)
return t;
else
throw bad_lexical_cast();
}
works fine for the class in the example above. Are there additional requirements on the target type that are not mentioned in the documentation or is this a really severe bug?
Change History (3)
comment:1 by , 13 years ago
| Cc: | added |
|---|
comment:2 by , 13 years ago
comment:3 by , 13 years ago
| Resolution: | → fixed |
|---|---|
| Severity: | Showstopper → Not Applicable |
| Status: | new → closed |
thanks, this solved the problem. the input operator thus has to be defined as
istream&
operator>>(istream& is, Foo& f)
{
return is >> f.fA >> ws >> f.fB;
}
(what a n00b mistake...)

You need to use std::ws between the two integers, because Boost.LexicalCast turns off skipping white space by default.