Possible Duplicate:
Overload resolution failure when streaming object via implicit conversion to string
I know it's not such a good idea to do this, but I really want to know the reason why the code below does not compile (i.e. why there is "no acceptable conversion"):
#include <iostream>
#include <string>
class Test
{
public:
operator std::string () const;
};
Test::operator std::string () const
{
return std::string("Test!");
}
int main ()
{
std::string str = "Blah!";
std::cout << str << std::endl;
Test test;
str = test;//implicitly calls operator std::string without complaining
std::cout << str << std::endl;
std::cout << test;//refuses to implicitly cast test to std::string
return 0;
}
On Visual Studio 2010 I get this error: "error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'Test' (or there is no acceptable conversion)
"
Does the <<
operator implicitly cast std::string
to something else in order to make use of it? If yes, what operator do I need to overload in my class to make such a thing work? I refuse to believe that I would actually need to use operator char *
.
operator<<(std::basic_ostream&, std::basic_string)
is a function template and user defined conversions are not considered during template argument deduction. You need to overload operator<<
for your class.
Another option, of course, is a cast
std::cout << static_cast<std::string>(test);
The problem is that std::string
is a specialisation of a template, std::basic_string<char>
, and the required overload of operator<<
is itself a template:
template<class charT, class traits, class Allocator>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>&& os,
const basic_string<charT,traits,Allocator>& str);
In order to be used for template argument deduction, a user-defined type has to be an exact match; conversions are not considered.
You will need to either provide an overload of operator<<
for your class, or explicitly convert to std::string
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With