Methoden überladen
-
Hallo,
ich bin etwas verwirrt. Ich rufe folgende Methode auf:
Settings->change_setting("preloading_lowest_price", "no");Zur Auswahl stehen:
void change_setting (string setting_name, string value); void change_setting (string setting_name, bool value) {cout << "bool"<<endl;if (value){change_setting(setting_name, "true");}else{change_setting(setting_name, "false");}}Es sollte die erste Methode aufgerufen werden. Lösche ich die zweite (mit bool aus Parameter), wird die erste aufgerufen und alles ist bestens. Will ich sie hingegen überladen, wird die zweite Methode aufgerufen! Noch merkwürdiger: Dann befindet sich das Programm in einer Endlosschleife, da die ganze Zeit die zweite Methode aufgerufen wird?
Auch ein Debuggen bestätigt, er springt in die "bool"-Methode und ruft sie immer wieder auf.
Könnt ihr da etwas Licht ins Dunkle bringen?
Edit: Anscheinend liegt es am Typ String. Wenn ich (string) "no" übergebe, klappt es. Vielleicht würde es gehen, wenn ich noch eine Methode schreibe, die ein char-Array erwartet. Aber ich will am Ende ja einen String herausbekommen, außerdem klappt es ja auch, wenn ich nur eine string-Methode habe..
-
Ulf schrieb:
Könnt ihr da etwas Licht ins Dunkle bringen?
Tja, da ist irgendwie die implizite Konvertierung von Zeigern nach bool im Weg.
Du könntest den zweiten Parameter zu const char* machen, dann wird diese Überladung genommen.
(PS: Wenn du etwas nur lesen möchtest, solltest du es via const& übergeben.)
-
ok, danke. Wenn ich noch eine Methode schreibe, die const char* erwartet und die dann auf die string-Methode direkt (ohne typecast) umleite, klappt es.
Das ist gut zu wissen..
-
Eigentlich besteht das Problem darin, dass die bool-Überladung zuviel schluckt. Wenn es gelingt, die implizite Konvertierung nach bool in den Griff zu bekommen, ist eine zusätzliche Überladung nicht erforderlich.
Für ein Funktionsargument, dass zur Argumentdeduktion eines Funktionstemplate herangezogen wird, werden die meisten impliziten Konvertierungen unterdrückt. Dass kann man sich per SFINAE zunutze machen.
Ersetze alsovoid change_setting (string setting_name, bool value)durch
#include <type_traits> typename std::enable_if<std::is_same<T, bool>::value>::type change_setting (string setting_name, T value) { out << "bool" << endl; change_setting(setting_name, value ? "true" : "false" ); }
-
@camper: Da fehlt das template <typename T>
