call of overloaded is ambigous



  • Hi,

    wieso bekomme so eine Fehlermeldung wenn meine Funktionen (meiner Meinung nach) doch eindeutig definiert sind?

    void setAlphabet(QString, QString, QString, QString);
    void setAlphabet(EventSet, EventSet, EventSet, EventSet);
    

    Ich hab zwar eine Lösung gefunden...

    ioPart->setAlphabet(QString("str1"), QString("..."),....);
    

    ... gefällt mit aber nicht so gut. Gibts von euch bessere Vorschläge?



  • Weil ev. ein EventSet (warum auch immer) aus einem string literal konstruirt werden kann und dessen konstruktor nicht explizit ist.



  • Du solltest eh mindestenst tr("str1") etc nehmen, damit du später deine Applikation durch den Linguist hauen kannst, sollte denn "str1" etc. für den Nutzer sichtbar sein.



  • ich glaub ich kanns mir doch selber erklären... kann sein dass der Compiler nicht weiss ob "str1" nun ein QString, oder ein EventSet (irgend eine eingen Klasse) ist? Weil ich dann später im Programm wieder die Funktion aufruf...

    EventSet a, b, c, d;
    ioPart->setAlphabet(a, b, c, d);
    

    und hier meckert der Compiler nicht mehr...
    Ja, ich glaub das hat sich erledigt...!



  • Allroad schrieb:

    kann sein dass der Compiler nicht weiss ob "str1" nun ein QString, oder ein EventSet (irgend eine eingen Klasse) ist?

    Der Compiler weiß ganz genau das es weder ein QString noch ein EventSet ist.



  • Fellhuhn schrieb:

    Der Compiler weiß ganz genau das es weder ein QString noch ein EventSet ist.

    Verstehe ich nicht ganz...Weiss nun der Compiler oder nicht um was für eine Variable es geht?



  • Allroad schrieb:

    Verstehe ich nicht ganz...Weiss nun der Compiler oder nicht um was für eine Variable es geht?

    Ja natürlich weiss der Compiler das, sonst hätte er arge Probleme Dein Programm zu compilieren. Was Fellhuhn sagen wollte, ist, dass "str1" weder QString noch EventSet ist, sondern ein Zeichenkettenliteral (mit dem Typ const char*).

    Da man const char* aber implizit in QString umwandeln kann, kannst Du aber eine Funktion, die QStrings erwartet, auch mit const char* aufrufen. So, vermutlich hat jetzt Deine Klasse EventSet (vermutlich ungewollt) ebenfalls eine Umwandlung von const char* drin, und damit weiss der Compiler nicht mehr welcher Umwandlung er Vorrang geben soll.



  • OK, (fast) alles klar 🙂 . Die Klasse EventSet habe ich selber nicht geschrieben, deswegen kann ich nicht sagen was da drin genau passiert (könnte zwar nachschauen... 😃 ). Was mir aber nicht ganz klar ist, wieso wird die Sache eindeutig, sobald ich tr("str1") benutze... Laut Doku. soll tr() ein Funktion sein die zum Übersetzten gedacht ist...

    Gruss,
    Mihai



  • Ich sagte nicht daß es dann eindeutig ist, nur sollte man es immer benutzen bei Qt, wenn man denn später eventuell mal die Software in mehreren Sprachen haben möchte.



  • Tatsache ist, dass sobald ich mein String in ein tr(), der übergeladenen Funkion übergebe, seint für den Compiler klar zu sein was ich meine und es funk. Naja, solage es funktioniert muss ich nicht alles verstehen 🙂 (das ist doch eine richtige Einstellung!)



  • Allroad schrieb:

    Tatsache ist, dass sobald ich mein String in ein tr(), der übergeladenen Funkion übergebe, seint für den Compiler klar zu sein was ich meine und es funk. Naja, solage es funktioniert muss ich nicht alles verstehen 🙂 (das ist doch eine richtige Einstellung!)

    tr() gibt ein QString zurück daher weiß der compiler danach was er damit machen muss 😉


Anmelden zum Antworten