Seite 1 von 1

Problem beim Ableiten eigener StreamKlasse von QTextStream

Verfasst: 2. Mai 2010 17:49
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

Verfasst: 2. Mai 2010 18:37
von Christian81
Du gibst ja auch nur einen QTextStream und kein myStream zurück. Aber warum überhaupt ableiten??

Re: Problem beim Ableiten eigener StreamKlasse von QTextStre

Verfasst: 2. Mai 2010 18:46
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;

Verfasst: 2. Mai 2010 21:12
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

Verfasst: 20. Mai 2010 11:55
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