Funktionsaufloesung bei ueberladenen funktionen
-
mal ne kleine frage
ich hab ne klasse mit 2 funktionenvoid fun(int); double fun(const int);
wenn ich nun
int i; double val=fun(i);
machen will finded mein compiler natuerlich das void fun(int) passend
wie bring ich dem dazu das double fun(const i); besser ist?double val=fun(static_cast<const int>(i));
bringt nix und i darf nicht kopiert werden, denn im original ist i nicht integer sondern ne menge mehr.
zZ ist meine Loesung soconst int &ri=i; double val=fun(i);
-
void foo(int)
und
void foo(const int)haben dieselbe signatur!
was du willst geht nicht.uU suchst du template funktionen?
-
tschuldigung aber
mit
const int &ri=i;
double val=fun(ri);
wird die double fun(const int); Funktion aufgerufen,
meiner meinung nacht ist (const int) != (int) und das beachtet der compiler da schon
-
meiner meinung nacht ist (const int) != (int) und das beachtet der compiler da schon
Du liegst mit deiner Meinung hier falsch.
Nocheinmal: Es gibt aus Sicht von C++ bei Funktionsparametern *keinen* Unterschied zwischen value und cons value.
void Func(int a){} void Func(const int a) {}
Das ist zweimal *exakt* die selbe Funktion Func. Es handelt sich also um zwei Definitionen der *selben* Funktion. Und das ist laut ODR illegal. Kein konformer Compiler darf das übersetzen.
Das ganze macht auch viel sinn: Da das Argument *by value* übergeben wird ist es sowieso implizit const. Es kann nicht von der Funktion verändert werden, da es die Funktion nie erreicht. Lediglich *der Wert* wird übergeben. Nicht das Objekt selbst. Ein const bringt also absolut überhaupt keinen Informationsgewinn.
Das ist nicht zu verwechseln mit:
void Func(int& a){} void Func(const int& a) {}
Das sind in der Tat zwei verschiedene Überladungen der Funktion Func.
wie bring ich dem dazu das double fun(const i); besser ist?
Die Antwort sollte nach dem oben gesagten klar sein: Gar nicht.
bringt nix und i darf nicht kopiert werden
const hat nix mit kopieren zu tun. Bei einer *by value* Übergabe wird *immer* kopiert. Was du scheinbar suchst sind Referenzparameter.
void Func(int& a){} void Func(const int& a) {} ... int i; Func(i); // ruft Func(int&) auf Func(2); // ruft Func(const int&) auf Func(2.0) // ruft Func(const int&) auf Func(const_cast<const int&>(i)); // ruft Func(const int&) auf
-
noch mal tschuldigung
es waren natuerlich uebergebene referenzen
und wie im text habe ich auch beim casten das "&" vergessen