Seite 1 von 1

[Qt4]cout???

Verfasst: 19. Juli 2005 13:45
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

Verfasst: 19. Juli 2005 15:42
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

Verfasst: 19. Juli 2005 15:56
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

Verfasst: 19. Juli 2005 16:02
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.

Verfasst: 19. Juli 2005 16:32
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?

Verfasst: 19. Juli 2005 16:48
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...

Verfasst: 19. Juli 2005 17:19
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

Verfasst: 19. Juli 2005 21:26
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

Nur zum Verständnis mal nachgefragt:

Verfasst: 20. Juli 2005 17:18
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.