It's been a long time since I've done any C++ programming, but I've started back up and for the most part, things are going well. This problem however, has me stumped. Basically, I'm working with the wxWidgets library which provides a class "wxString" that works like a std::string except it also provides a stream-like overloaded << operator to concatenate non-string values at the end of the string. If, for example, you have a logging function that accepts a wxString it lets you do stuff like:
Code:
void Log(wxString const& in) {...}
class Foo
{
int bar;
public:
LogBar()
{
Log(wxString("Bar is ") << bar << " right now.");
}
}
However when I try to define my own overloaded << operator for my own classes, things go wrong, but ONLY if I use it on a temporary object like above. Very much condensed (and non-wxWidgets specific) here's a complete program that causes the problem:
Code:
#include <iostream>
#include <string>
class StreamString
{
public:
std::string buffer;
StreamString() {};
};
class ThingToPutInStream
{
public:
ThingToPutInStream() {}
};
StreamString& operator << (StreamString & stream, ThingToPutInStream const& in)
{
stream.buffer += "ThingToPutInStream";
return stream;
}
void OutputStreamString(StreamString const& in)
{
std::cout << in.buffer;
}
int main()
{
{
StreamString foo = StreamString();
OutputStreamString(foo << ThingToPutInStream());
}
// these four lines compile normally
OutputStreamString(StreamString() << ThingToPutInStream());
// this line fails to compile
return 0;
}
Which gives the error: (compiled with mingw32-g++ 3.4.5)
Code:
C:\Stuff\temptest.cpp||In function `int main()':|
C:\Stuff\temptest.cpp|37|error: no match for 'operator<<' in 'StreamString() << ThingToPutInStream()'|
C:\Stuff\temptest.cpp|19|note: candidates are: StreamString& operator<<(StreamString&, const ThingToPutInStream&)|
||=== Build finished: 1 errors, 0 warnings ===|
As far as I can tell the two bits of code in the main function are functionally equivalent; so why does one give me that error?
I'm obviously missing something here and I get the feeling it's something obvious, but I can't figure out. How do I get this operator to work with temporary objects?
Thanks in advance!