Problem beim Ableiten eigener StreamKlasse von QTextStream

Alles rund um die Programmierung mit Qt
Antworten
Troll.Soft
Beiträge: 190
Registriert: 18. Juni 2008 09:52
Wohnort: Hamburg

Problem beim Ableiten eigener StreamKlasse von QTextStream

Beitrag von Troll.Soft »

Hallo,
ich habe eine eigene Streamklasse abgeleitet von QTextStream mit eigenen Manipulatoren. Alles kompiliert, startet und läuft durch. Der Aufruf eines Manipulators ist auch ok. Rufe ich aber in einer Streamzeile zwei Manipulatoren oder mehr auf, erhalte ich ab dem zweiten nur die Adresse. Das ist nicht schön :(

Code: Alles auswählen

class myStream	:	public QTextStream
{
public:
	myStream()	{	setString(&Buffer, QIODevice::WriteOnly);	}
	friend QTextStream& my(myStream& ml)	{	return ml << "<myStream>";	}
private:
	QString Buffer;
};

// manipulator function
inline QTextStream& operator<<(myStream& ml, QTextStream& (*function)(myStream&) )
{	return (*function)(ml);	}

int main( int Argc, char ** Argv ) 
{
	myStream MyStream;

	MyStream << my;
	MyStream << my << my;
	qWarning() << *(MyStream.string());
	exit(0);
}
bin für jeden Tip dankbar.
tschüß
Troll.Soft
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Du gibst ja auch nur einen QTextStream und kein myStream zurück. Aber warum überhaupt ableiten??
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Problem beim Ableiten eigener StreamKlasse von QTextStre

Beitrag von franzf »

Troll.Soft hat geschrieben:Alles kompiliert, startet und läuft durch.
Hier kompiliert es nicht einmal...

Code: Alles auswählen

make
g++ -c -pipe -march=k8 -O2 -pipe -msse3 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o main.o main.cpp
main.cpp: In function »int main(int, char**)«:
main.cpp:25: Fehler: ambiguous overload für »operator<<« in »operator<<(((myStream&)(& MyStream)), my) << my«
/usr/include/qt4/QtCore/qtextstream.h:184: Anmerkung: Kandidaten sind: QTextStream& QTextStream::operator<<(QChar) <nahe Übereinstimmung>
/usr/include/qt4/QtCore/qtextstream.h:185: Anmerkung:                  QTextStream& QTextStream::operator<<(char) <nahe Übereinstimmung>
/usr/include/qt4/QtCore/qtextstream.h:186: Anmerkung:                  QTextStream& QTextStream::operator<<(short int) <nahe Übereinstimmung>
/usr/include/qt4/QtCore/qtextstream.h:187: Anmerkung:                  QTextStream& QTextStream::operator<<(short unsigned int) <nahe Übereinstimmung>
/usr/include/qt4/QtCore/qtextstream.h:188: Anmerkung:                  QTextStream& QTextStream::operator<<(int) <nahe Übereinstimmung>
/usr/include/qt4/QtCore/qtextstream.h:189: Anmerkung:                  QTextStream& QTextStream::operator<<(unsigned int) <nahe Übereinstimmung>
/usr/include/qt4/QtCore/qtextstream.h:190: Anmerkung:                  QTextStream& QTextStream::operator<<(long int) <nahe Übereinstimmung>
/usr/include/qt4/QtCore/qtextstream.h:191: Anmerkung:                  QTextStream& QTextStream::operator<<(long unsigned int) <nahe Übereinstimmung>
/usr/include/qt4/QtCore/qtextstream.h:192: Anmerkung:                  QTextStream& QTextStream::operator<<(qlonglong) <nahe Übereinstimmung>
/usr/include/qt4/QtCore/qtextstream.h:193: Anmerkung:                  QTextStream& QTextStream::operator<<(qulonglong) <nahe Übereinstimmung>
/usr/include/qt4/QtCore/qtextstream.h:199: Anmerkung:                  QTextStream& QTextStream::operator<<(const void*) <nahe Übereinstimmung>
/usr/include/qt4/QtCore/qtextstream.h:290: Anmerkung:                  QTextStream& operator<<(QTextStream&, QTextStream& (*)(QTextStream&)) <nahe Übereinstimmung>
main.cpp: At global scope:
main.cpp:20: Warnung: unbenutzter Parameter »Argc«
main.cpp:20: Warnung: unbenutzter Parameter »Argv«
make: *** [main.o] Fehler 1
Irgendwo auch verständlich. Dein operator<< gibt ein QTextStream zurück - und für QTextStream hast du keine Überladung angeboten.

Lösung: my() und operator<<() müssen auch ein myStream& zurück geben.
Und bitte aufpassen:

Code: Alles auswählen

return ml << "<myStream>";
Gibt eine QTextStream zurück!
Besser:

Code: Alles auswählen

ml << "<myStream>"; return ml;
Troll.Soft
Beiträge: 190
Registriert: 18. Juni 2008 09:52
Wohnort: Hamburg

Beitrag von Troll.Soft »

danke :D
das Eingedampfte läuft nach den Tipps.
Werde mich nun um den gesamten Code kümmern und die Portierung nach Linux.
tschüß
Troll.Soft
Troll.Soft
Beiträge: 190
Registriert: 18. Juni 2008 09:52
Wohnort: Hamburg

Beitrag von Troll.Soft »

Christian81 hat geschrieben:Aber warum überhaupt ableiten??
Weil ich die Funktionalität von QTextStream nutzen möchte. Falls Du einen einfacheren Vorschlag hast, würde ich ihn gerne nutzen.

Wichtiger ist mir allerdings, das die einfachen Manipulatoren noch nicht laufen. Code siehe unten. Unter VC2008 compiliert der Code einwandfrei, unter MinGW gibt es einen Fehler error: 'my' was not declared in this scope

Code: Alles auswählen

#include <QtCore>

class myStream	:	public QTextStream
{ 
public: 
	myStream() : QTextStream()			{	setString(&Buffer, QIODevice::WriteOnly);	} 
	friend myStream& my(myStream& ml)	{	ml << "<myStream>";	return ml;	} 
private: 
	QString Buffer; 
}; 


// manipulator function 
inline myStream& operator<<(myStream& ml, myStream& (*function)(myStream&) ) 
{	return (*function)(ml);	} 


int main() 
{
	myStream MyStream; 

	my(MyStream);

	MyStream << my;
	qWarning() << *(MyStream.string());

	MyStream << "hallo" << my;
	qWarning() << *(MyStream.string());

	exit(0); 
}
wie muß ich den Code ändern, damit der gcc zufrieden ist?

tschüß
Troll.Soft
Antworten