Re: error C2679: binary '<<' : no operator found which takes a right-hand
operand of type 'std::string' (or there is no acceptable conversion)
David Wilkinson wrote:
Yes, other standard headers can include <string> or forward declare
`std::string' for internal purposes. However, you should not rely on
it. In your specific case, `operator <<' that writes `std::string'
into a stream is declared inside <string>.
Without looking at the headers in detail, I would have to say that I am
still confused (for the same reason as Tim). But clearly you are
correct, <string> is missing.
I don't have VC7.1 to check this case, but VC2005 compiles
and links it without any problem.
Anyway, `basic_string' is implemented in <xstring> header,
actually. Several standard headers include <xstring> either
directly or indirectly because of methods that return
`std::string' and/or accept it as a parameter. That's why
`std::string' is available in user's code too when something
like <iostream> or <exception> is included. However, I/O
operators that work with `std::string' are declared in
<string>. As long as one doesn't read/write strings from/to
streams one can get away with working code without including
<string>.
Implementation of other standard classes can be scattered
among several headers, too. It gives a developer an illusion
as if compiler "knows" partially about some classes.
This issue of missing headers is the single most common problem I find
in cross-platform work.
I agree. That's why I insist on nightly cross-platform build
when I work on cross-platform a project. It helps to
pinpoint such problems early.
Alex