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:
Gibt eine QTextStream zurück!
Besser:
Verfasst: 2. Mai 2010 21:12
von Troll.Soft
danke
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