[Gelöst] Compilerfehler - Nutzung einer einfachen Funktion

Alles rund um die Programmierung mit Qt
Antworten
Kurby
Beiträge: 16
Registriert: 9. Februar 2012 10:03

[Gelöst] Compilerfehler - Nutzung einer einfachen Funktion

Beitrag von Kurby »

Hi!

Ich versuche mich derzeit an einer Änderung eines fremden Quellcodes, bzw. mit meinen eigens geschriebenen Funktionen die fremden Funktionen zu nutzen. Dabei handelt es sich um das OpenSource Projekt Mumble.

Leider funktionieren dabei nicht die einfachsten Funktionen, die eigentlich zum Qt Standard gehören. Aber vielleicht bin ich auch nur etwas kurzsichtig.

Hier die Zeieln, in den der Fehler entsteht:

Code: Alles auswählen

qleChannelName->setText("Testname");
Wie gesagt: sehr einfach ;)

Dazu der Fehler, den der Compiler mir dazu gibt:

Code: Alles auswählen

XYZ.cpp(255) : error C2664: 'QLineEdit::setText' : cannot convert parame ter 1 from 'const char [9]' to 'const QString &'
        Reason: cannot convert from 'const char [9]' to 'const QString'
        No constructor could take the source type, or constructor overload resolution was ambiguous
Was genau heißt diese Meldung?

Ist es evtl. richtig, dass der Konstruktor der Methode "setText" geändert wurde? Allerdings wird einige Zeilen weiter unten die Methode folgendermaßen genutzt, dort erscheint kein Fehler:

Code: Alles auswählen

mpcs.set_name(u8(qleChannelName->text()));
Die Definition der Funktion "set_Name" lautet: "XYZ::set_name(const char *value, size_t size)"


Vielen Dank für eure Hilfe!
Zuletzt geändert von Kurby am 4. April 2012 17:43, insgesamt 1-mal geändert.
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: Compilerfehler - Nutzung einer einfachen Funktion

Beitrag von brax »

Also die Fehlermeldung bezieht sich darauf, dass setText ein const QString& haben möchte und Du ihr ein const char[9] gibst. Dass dort von Konstruktor die Rede ist, liegt daran, dass ein QString Konstruktor aufgerufen werden muss, um eben aus dem char-Array einen QString zu machen. Warum der Compiler da meckert kann ich mir aber nicht so recht erklären, denn es gibt ja den QString Konstruktor mit einem const char* und der ist auch nicht explicit oder ähnliches, sollte also zur impliziten Umwandlung dort genutzt werden. Welchen Compiler benutzt Du denn?

Was auf jeden Fall funktionieren sollte ist folgendes:

Code: Alles auswählen

qleChannelName->setText(QString("Testname"));
weil Du damit dem Compiler die Arbeit abnimmst, den richtigen Konstruktor für QString auszuwählen.

Übrigens:
Ist es evtl. richtig, dass der Konstruktor der Methode "setText" geändert wurde?
Ist ganz großer Quatsch (sorry). Eine Methode hat bestimmt keinen Konstruktor...
Kurby
Beiträge: 16
Registriert: 9. Februar 2012 10:03

Re: Compilerfehler - Nutzung einer einfachen Funktion

Beitrag von Kurby »

Hi!

Ich habe die zeile nun so geändert. Leider tritt immer noch ein Fehler auf, der auf diese zeile verweist.

Allerdings scheint es diesmal ein anderer zu sein, zumindest etwas ist anders dies mal:

Code: Alles auswählen

XYZ.cpp(255) : error C2440: '<function-style-cast>' : cannot convert from 'const char [9]' to 'QString'
        No constructor could take the source type, or constructor overload resolution was ambiguous
Vielen Dank nochmals ;)
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: Compilerfehler - Nutzung einer einfachen Funktion

Beitrag von brax »

Funktioniert denn wenigstens

Code: Alles auswählen

QString tmp("Testname");
qleChannelName->setText(tmp);
?

Welcher Compiler war das nochmal?

Jag das hier mal durch den Compiler:

Code: Alles auswählen

#include <QDebug>

void func(const QString& foo ) {
	qDebug() << foo;
}

int main(int argc, char** argv) {
	QString tmp("asdf");
	func(tmp);
	func(QString("asdf"));
	func("asdf");
	return 0;
}
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Compilerfehler - Nutzung einer einfachen Funktion

Beitrag von franzf »

Das sollte die Ursache sein:

Code: Alles auswählen

    // ASCII compatibility
#ifndef QT_NO_CAST_FROM_ASCII
    inline QT_ASCII_CAST_WARN_CONSTRUCTOR QString(const char *ch) : d(fromAscii_helper(ch))
    {}
Du musst also entweder per #undef QT_NO_CAST_FROM_ASCII rauswerfen, oder per QString:fromLocal8Bit und Konsorten konvertieren (besser, da ich ich nicht weiß, ob das Macro aus der qconf genommen wird, weil gar kein Ascii-Support einkompiliert ist - findest du aber ganz schnell raus, wenn es einen Linker-error gibt :P)
Kurby
Beiträge: 16
Registriert: 9. Februar 2012 10:03

Re: Compilerfehler - Nutzung einer einfachen Funktion

Beitrag von Kurby »

franzf hat geschrieben:Das sollte die Ursache sein:

Code: Alles auswählen

    // ASCII compatibility
#ifndef QT_NO_CAST_FROM_ASCII
    inline QT_ASCII_CAST_WARN_CONSTRUCTOR QString(const char *ch) : d(fromAscii_helper(ch))
    {}
Du musst also entweder per #undef QT_NO_CAST_FROM_ASCII rauswerfen, oder per QString:fromLocal8Bit und Konsorten konvertieren (besser, da ich ich nicht weiß, ob das Macro aus der qconf genommen wird, weil gar kein Ascii-Support einkompiliert ist - findest du aber ganz schnell raus, wenn es einen Linker-error gibt :P)
Vielen Dank!

Das war der entscheidene Hinweis.

Für Suchende hier nun mein Code der so funktioniert (zumindest bei mir):

Code: Alles auswählen

qleChannelName->setText(QString::fromLocal8Bit("Testname"));
Antworten