stream will noch nicht so, wie ich will



  • moin,
    ich habe eine Klasse "class myStream" die auch fröhlich streamt. Folgende Konstruktion stößt auf einen Compilererror unter gcc:
    myStream() << " hallo "; // Fehlermeldung no match for 'operator<<' in 'myStream() << " hallo "'
    Brauche einen Tip.
    tschüß
    Troll.Soft

    #include <sstream> 
    #include <iostream>
    
    using namespace std;
    
    class myStream; 
    myStream& my(myStream&);
    
    class myStream 
    { 
    public: 
    	myStream()	{} 	
    	~myStream()	{	cout << "start " << o.str() << " ende";	} 
    
    	friend myStream& my(myStream& stream)	{	stream << "<myStream>";	return stream;	} 
    
    	friend myStream& operator<<(myStream& stream, const char* S)	{	stream.o << S;	return stream;	} 
    
    	string str() const	{	return o.str();	}
    private:
    	ostringstream o;
    }; 
    
    // manipulator function 
    inline myStream& operator<<(myStream& stream, myStream& (*function)(myStream&) ) 
    {	return (*function)(stream);	} 
    
    int main() 
    {
    	myStream MyStream; 
    
    	MyStream	<< " hallo " << my << " hallo " << my;
    	myStream()	<< " hallo " << my << " hallo " << my;	// mit VC2008 ok  // mit gcc error: no match for 'operator<<' in 'myStream() << " hallo "'
    
    	cout << MyStream.str();
    }
    


  • Weil myStream() ein Funktionsaufruf ist. Und keine Ueberladung existiert, die mittels << irgendwas in die Funktion piped.



  • knivil schrieb:

    Weil myStream() ein Funktionsaufruf ist. Und keine Ueberladung existiert, die mittels << irgendwas in die Funktion piped.

    Aber es muss eine Trick geben, denn wenn ich direkt von ostringstream ableite meckert gcc nicht mehr über "myStream() << my;", gibt aber ein Warnung heraus.
    Man braucht also noch einen Trick.
    Hier ist der Code nur mit Warnung:

    #include <sstream> 
    #include <iostream>
    
    using namespace std;
    
    class myStream; 
    myStream& my(myStream&);
    
    class myStream	:	public ostringstream
    { 
    public: 
    	myStream()	:	ostringstream()	{} 	
    	~myStream()	{	cout << "  start " << str() << " ende  ";	} 
    
    	friend myStream& my(myStream& stream)	{	stream << "<myStream>";	return stream;	} 
    }; 
    
    // manipulator function 
    inline myStream& operator<<(myStream& stream, myStream& (*function)(myStream&) ) 
    {	return (*function)(stream);	} 
    
    int main() 
    {
    	myStream()	<< my;	//	warning: the address of 'myStream& my(myStream&)' will always evaluate as 'true'
    }
    

    tschüß
    Troll.Soft



  • Meine erste Erklaerung ist wahrscheinlich falsch. Jedoch funktioniert dein zweites Beispiel auch nicht korrekt, bei mir ist <stream> nicht in der Ausgabe zwischen start und ende. Was den Trick betrifft: Ich wuerde nie so programmieren. Einfach Konstruktion und Benutzung des Objektes trennen.



  • knivil schrieb:

    bei mir ist <stream> nicht in der Ausgabe zwischen start und ende.

    Ja, da kommt die Warnung zum Tragen und es wird nur "true" ausgegeben.
    Ich will ja nicht unbedingt von ostringstream ableiten. Mir reicht der Trick mit dem ostringstream diese Konstruktion "myStream()" zum Laufen bringt.

    tschüß
    Troll.Soft


Anmelden zum Antworten