[Qt4]cout???

Alles rund um die Programmierung mit Qt
Antworten
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

[Qt4]cout???

Beitrag von Flachkoepper »

Mahlzeit,

habe ein Qt3-Projekt nach Qt4 portiert. Ging, wenn auch mühsam. Was ich aber jetzt auf jeden Fall nicht verstehe, warum der Compiler (gcc 3.3.5) jetzt bei meinen ganzen Konsolenausgaben mittels cout<< rummeckert. Wenn ich z.B. schreibe:

QString str("hallo");
cout << str;

gibt er einen Fehler beim Compilieren aus.
Habe ich irgendwas vergessen? Muss ich irgendein neues #include einfügen oder irgendwas in der Art?

Viele Grüße,
Flachkoepper
Hermes
Beiträge: 9
Registriert: 2. Juni 2005 16:54

Beitrag von Hermes »

Na da machste aber auch nen 'Flachkoepper' ;)

Also die cout Ausgabe geht auf die Konsole ... Aber ich glaube, du willst im Moment eine Anwendung mit grafischer Oberfläche poggen.

Also du kannst <iostream> includen und Deine QT Anwendung aus nem DOS-Fenster starten, dann siehst du die cout Ausgaben in der DOS-Box ... aber naja is nich elegant für nen grafisches Programm.


Mfg Hermes
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag von Flachkoepper »

Also,

Erstmal macht Flachkoepper Laune.
Zweitens habe ich wohl vergessen zu sagen, dass zu Anfang meines Codes durchaus ein

#include <iostream>
using namespace std;

steht. Und drittens benutze ich die Ausgaben auf die Konsole nur für mich, um mir einiges ausgeben zu lassen. Ich weiß, dass das nicht so elegant ist und eigentlich ein qDebug angebracht wäre.
Mein Problem, um es nochmal zu schildern, besteht jetzt darin, dass er mit Qt4 bei

cout << <Hier steht jetzt ein QString>

anmerkt: ... ambiguous overload for 'operator<<' in std::cout ...
Und das versteh ich nicht, zumal er dieselben Sachen mit Qt3 ohne Probleme compiliert hat.

Viele Grüße,
Flachkoepper
Hermes
Beiträge: 9
Registriert: 2. Juni 2005 16:54

Beitrag von Hermes »

Ahh also mit einer Fehlerbeschreibung kann man natürlich mehr sagen.

Also da scheint es schon einen Operator zu geben, der '<<' heisst ... naja Binäroperatoren z.B. haben auch diese Operatoren.

Vieleicht kommt aber cout auch nicht so 100% mit nem QString klar. Versuch den doch mal auf nen C-String umzucasten.
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag von Flachkoepper »

Nun denn,

mit 'std::string QString::toStdString () const' klappts. Frage: Warum konnte Qt3 'cout << QString' oder vielmehr warum kann das Qt4 nicht mehr?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Flachkoepper hat geschrieben: anmerkt: ... ambiguous overload for 'operator<<' in std::cout ...
Schonmal versucht den Fehler zu verstehen? Und evtl. auch den kompletten Fehlertext posten (und das evtl. gleich im ersten Post).
ambiguous heisst doppeldeutig...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag von Flachkoepper »

Sorry,

aber wenn ich den Fehler incl. Abhilfemöglichkeit verstehen würde, würde ich hier nicht nachfragen.

Mein Code-Schnippsel:

Code: Alles auswählen

...
QDir workDir("/tmp/testdata");
cout << workDir.absolutePath();
...
Und hier nochmal die Ausgabe des Compilers:

Code: Alles auswählen

g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_CORE_LIB -DQT_GUI_LIB -DQT_QT3SUPPORT_LIB -DQT3_SUPPORT -DQT_SHARED -I/usr/local/Trolltech/Qt-4.0.0/mkspecs/default -I. -I/usr/local/Trolltech/Qt-4.0.0/include/Qt3Support -I/usr/local/Trolltech/Qt-4.0.0/include/QtGui -I/usr/local/Trolltech/Qt-4.0.0/include/QtCore -I/usr/local/Trolltech/Qt-4.0.0/include -I. -I. -I. -o profilmainwindow.o profilmainwindow.cpp
profilmainwindow.cpp: In member function `virtual void
   ProfilMainWindow::profilNeu()':
profilmainwindow.cpp:248: error: ambiguous overload for 'operator<<' in '
   std::cout << QDir::absolutePath() const()'
/usr/include/c++/3.3.5/bits/ostream.tcc:63: error: candidates are:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(std::basic_ostream<_CharT,
   _Traits>&(*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char,
   _Traits = std::char_traits<char>] <near match>
/usr/include/c++/3.3.5/bits/ostream.tcc:74: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(std::basic_ios<_CharT,
   _Traits>&(*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits
   = std::char_traits<char>] <near match>
/usr/include/c++/3.3.5/bits/ostream.tcc:86: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(std::ios_base&(*)(std::ios_base&)) [with _CharT = char,
   _Traits = std::char_traits<char>] <near match>
/usr/include/c++/3.3.5/bits/ostream.tcc:122: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:156: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:98: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(bool) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:178: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(short int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:189: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:193: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:204: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:181: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long long int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:216: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:241: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(double) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:219: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(float) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:265: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(long double) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:289: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(const void*) [with _CharT = char, _Traits =
   std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:313: error:
   std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
   _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT =
   char, _Traits = std::char_traits<char>] <near match>
/usr/include/c++/3.3.5/ostream:491: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, const unsigned char*) [with _Traits = std::char_traits<char>]
   <near match>
/usr/include/c++/3.3.5/ostream:486: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, const signed char*) [with _Traits = std::char_traits<char>] <near
   match>
/usr/include/c++/3.3.5/bits/ostream.tcc:616: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, const char*) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:572: error:
   std::basic_ostream<_CharT, _Traits>&
   std::operator<<(std::basic_ostream<_CharT, _Traits>&, const char*) [with
   _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:452: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, unsigned char) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:447: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, signed char) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/bits/ostream.tcc:512: error:
   std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
   _Traits>&, char) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.3.5/ostream:436: error:
   std::basic_ostream<_CharT, _Traits>&
   std::operator<<(std::basic_ostream<_CharT, _Traits>&, char) [with _CharT =
   char, _Traits = std::char_traits<char>]
make: *** [profilmainwindow.o] Fehler 1
So wie ich das nur verstehe, kann der Operator '<<' mit Daten vom Typ QString nicht um. Ist das das ganze Geheimnis?

Viele Grüße,
Flachkoepper
uhu01
Beiträge: 150
Registriert: 10. Juli 2005 20:46

Beitrag von uhu01 »

Hy!

Ja, das ist das ganze Geheimniss, bei Qt4 ist der operator<< für den QString nicht mehr überladen. Deswegen musst du auf std::string casten.

mfg
uhu01
taki
Beiträge: 30
Registriert: 8. Februar 2005 15:52
Wohnort: Berlin

Nur zum Verständnis mal nachgefragt:

Beitrag von taki »

Kenne mich mit Überladen von Operatoren nicht wirklich aus, bin noch ziemlich neu in C++. Bei Funktionen geht so etwas:

Wenn zwei Funktionen mit gleichem Muster aber unterschiedlichem Rückgabetyp existieren und eine davon an einer Stelle verwendet werden soll, an der beide Datentypen zugelassen sind, gibt es genau die beschriebene Fehlermeldung.

Ich könnte mir also auch vorstellen, dass es für << in der QString Klasse zwei Überladungen gibt, die passen könnten und der Compiler nicht weiß, welche Du verwenden möchtest.

Ob das auch für überladene Operatoren gilt, weiß ich nicht. Wahrscheinlicher ist wohl die Antwort von uhu01. Obwohl ich finde, dass ambiguous eher dazu passen würde, wenn es mehrere passende Operatorimplementationen gäbe als wenn es keine gäbe.
Antworten