Alles rund um die Programmierung mit Qt
Troll.Soft
Beiträge: 190 Registriert: 18. Juni 2008 09:52
Wohnort: Hamburg
Beitrag
von Troll.Soft » 2. Mai 2010 17:49
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 » 2. Mai 2010 18:37
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
Beitrag
von franzf » 2. Mai 2010 18:46
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:
Troll.Soft
Beiträge: 190 Registriert: 18. Juni 2008 09:52
Wohnort: Hamburg
Beitrag
von Troll.Soft » 2. Mai 2010 21:12
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
Troll.Soft
Beiträge: 190 Registriert: 18. Juni 2008 09:52
Wohnort: Hamburg
Beitrag
von Troll.Soft » 20. Mai 2010 11:55
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