URL: https://www.overclockers.at/coding-stuff/c-frage_199839/page_1 - zur Vollversion wechseln!
Hallo an alle,
gestern hatte ein Arbeitskollege ein seltsames Problem, vielleicht kennt sich ja wer von euch mit C++ aus.
Code:#include <iostream> class A {}; class B : public A {}; template<typename T> void f(T) { std::cout << "f(T)" << std::endl; } void f(A*) { std::cout << "f(A*)" << std::endl; } int main() { int x = 42; A a; B b; f(x); f(&a); f(&b); return 0; }
ändert.
vielleicht diese seite hier: http://www.gotw.ca/publications/mill17.htm
edit: ok, nachdems ichs jetzt mal ausprobiert hab und den gesamten output gesehen hab versteh ich erst was du meinst 
also ich kenn den standard nicht, aber für mich machts schon sinn. er schaut sich die A* funktion an und sieht, dass es nicht der gleiche typ ist. dann schaut er sich die T funktion an die eben den gleichen typ hat -> ergo nimmt er die.
das "erstaunliche" verstehe ich nicht ganz. T& wäre ja eine referenz, die wird er nicht nehmen weils nicht passt. die T* zieht er nach wie vor der A* vor.
early-/latebinding issue maybe?
Zitat von icadas "erstaunliche" verstehe ich nicht ganz. T& wäre ja eine referenz, die wird er nicht nehmen weils nicht passt. die T* zieht er nach wie vor der A* vor.
sein - der Aufruf sieht gleich aus. Daher fand ichs erstaunlich, dass das einen Unterschied macht. Aber ich hab die hinterlistigen Details von Referenzen nie völlig durchschaut.Das gelöst musst du unter Anführungszeichen setzen ...Zitat von thatDas Problem ist also im Prinzip gelöst - aber wer kanns erklären?
im Template mit B* aufrufst -> und das ist nicht gültig ... Würdst du statt f(T&
ein f(T*) nehmen, dann wäre das wieder ein korrekter Aufruf und es würde wieder "nicht funktionieren" ...
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026