warnung bei Template
-
Hi,
ich bekomm bei folgendem Template eine warnung, wenn ich es benutze:
template <class T> inline const T& deg2rad (const T& rad) { return (rad * 0.017453292519943295769222222222222f); }
ich benutze es so:
Vertex Vertex::getRotatedY(float degrees) const { float angle = deg2rad (degrees); ...
und bekomme diese Warnung:
warning C4172: returning address of local variable or temporary
see reference to function template instantiation 'const T °2rad(const T &)' being compiled
with
[
T=float
]Hab ich irgendetwas übersehen??
-
Hallo,
die Warnung hat überhaupt nichts mit Templates zu tun. Du lieferst eine *Referenz* auf ein lokales und dazu noch temporäres Objekt zurück. Das referenzierte Objekt lebt nur bis zum Ende der return-Anweisung. Nachdem die Funktion zurückgekehrt ist, ist das Objekt längst tot. Du hast also *keine* Möglichkeit das Funktionsergebnis zu verwerten.
Lösung:
return-by-valuetemplate <class T> inline T deg2rad (const T& rad) { return rad * 0.017453292519943295769222222222222f; }
-
Ich dachte Referenzen können nicht ungültig werden.
-
+++ schrieb:
Ich dachte Referenzen können nicht ungültig werden.
Tja, und die Holländer dachten sie könnte die Deutschen schlagen. So ist das im Leben. Häufig denkt man sich irgendwas und dann stellt sich raus, dass die Wirklichkeit ganz anders aussieht
Referenzen können genau wie Pointer auch mit der Zeit ungültig werden. Das geschieht immer dann, wenn sie länger Leben als das Objekt, das sie referenzieren:
int* i = new int(22); int& r = *i; delete i; r = 12; // Ups!
Oder:
const string& func(const string& s) {return s;} int main() { cout << func("Hallo"); // Ups }