Fehler im Stream [gelöst]



  • Hallo,
    ich habe hier ein Prog mit einem Stream und alles compiliert und läuft. Der Code in der letzten Zeile ist auskommentiert. "myStream() << my;" Aber genau diesen Code brauche ich. Der gcc ist schwer am motzen, wenn er diesen Code sieht. Unter VC compiliert alles problemlos;

    #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.	o << "<myStream>";	return stream;	} 
    	myStream& operator<<(const char* m)		{			o << m;				return *this;	}
    
    private:
    	ostringstream o;
    }; 
    
    // manipulator function 
    inline myStream& operator<<(myStream& stream, myStream& (*function)(myStream&) ) 
    {	return (*function)(stream);	} 
    
    int main() 
    {
    	myStream o;
    	o << my;
    	o << "y";
    	o << "z" << my;
    
    	myStream() << "" << my << my << "" << my;
    //	myStream() << my;	//  erzeugt untenstehenden error im gcc
    }
    
    /*
    35: error: no match for 'operator<<' in 'myStream() << my'
    16: note: candidates are: myStream& myStream::operator<<(const char*)
    23: note:                 myStream& operator<<(myStream&, myStream& (*)(myStream&))
    */
    

    Bin für jeden Tip dankbar
    tschüß
    Troll.Soft



  • Das Problem könnte sein, dass myStream() kein LValue ist und somit für my als Parameter nicht in Frage kommt. Frag mich aber bitte nicht, was den GCC dazu bewegt, den Sachverhalt bei myStream() << "" anders zu sehen.



  • ipsec schrieb:

    Frag mich aber bitte nicht, was den GCC dazu bewegt, den Sachverhalt bei myStream() << "" anders zu sehen.

    Man darf temporäre Objekte zwar nicht als nichtkonstante Referenz an eine Funktion übergeben, aber man darf deren non-const Memberfunktionen aufrufen (also auch operator<<(const char*)).
    Dass man das const auf diese Weise ganz leicht wegbekommt, war mir gar nicht bewusst... und ob das im Sinne der Erfinder war, weiß ich auch nicht.



  • Wenn ich den Code so erweitere

    ostringstream& my2(ostringstream& stream)	{	stream << "<my2Stream>";	return stream;	} 
    
    int main() 
    {
    	myStream o;
    	o << my;
    	o << "y";
    	o << "z" << my;
    
    	myStream() << "" << my << my << "" << my;
    //	myStream() << my;
    	ostringstream() << "hicks";
    	ostringstream() << my;	//	38: warning: the address of 'myStream& my(myStream&)' will always evaluate as 'true'
    }
    

    compiliert der gcc durch, allerdings mit einer Warnung. Irgendwie muß man da doch tricksen können, so das es geht. 🤡

    tschüß
    Troll.Soft



  • Kannst du schon, du musst operator<<(myStream&(*)(myStream&)) halt nur auch mit in die Klasse nehmen.



  • Athar schrieb:

    Kannst du schon, du musst operator<<(myStream&(*)(myStream&)) halt nur auch mit in die Klasse nehmen.

    Wenn ich diesen Code in die Klasse mit reinnehme

    myStream& operator<<(myStream&(*)(myStream&) )	{ o << "hi fan";	return *this;	}
    

    compiliert alles durch und

    myStream() << my;
    

    liefert den fan aus, aber dann wird dieser Code

    myStream o;
    	o << my;
    

    bemängelt mit

    L:/code/html/main_html_test_stream_iostream/main_html_test_stream_iostream.cpp:34: error: ambiguous overload for 'operator<<' in 'o << my'

    Brauche weitere Anregungen
    tschüß
    Troll.Soft



  • Wenn du den operator<< in die Klasse reinnimmst, muss die globale Funktion entsprechend weg.



  • Athar schrieb:

    Wenn du den operator<< in die Klasse reinnimmst, muss die globale Funktion entsprechend weg.

    Oh je, da hatte ich wohl etwas mißverstanden. Aber juchhe, nach korrekter Ausführung Deines Vorschlages funktioniert es. Hier ist der Code.

    #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.	o << "<myStream>";	return stream;	} 
    	myStream& operator<<(const char* m)		{			o << m;				return *this;	}
    
    // manipulator function 
    inline myStream& operator<<(myStream& (*function)(myStream&) ) {	return (*function)(*this);	} 
    
    private:
    	ostringstream o;
    }; 
    
    int main() 
    {
    	myStream o;
    	o << my;
    	o << "y";
    	o << "z" << my;
    
    	myStream() << "" << my << my << "" << my;
    	myStream() << my;
    }
    

    danke
    Troll.Soft


Anmelden zum Antworten