Funktionszeiger
-
Hallo zusammen,
kann mir jemand sagen, warum beim folgenden Code der Fehler "reference to plus is ambiguous" erscheint? Irgendwie steh ich aufm Schlauch.
#include <iostream> using namespace std; void (*foo)(int&); void plus(int& x) { x++; } void minus(int& x) { x--; } int main() { int a = 10; foo = plus; foo(a); cout << a << endl; return 0; }Vielen Dank
LG, freakC++
-
Mach das
using namespace std;weg, das ist nie eine gute Idee.
-
Tatsächlich! Daran lag es. Was hat den std damit zu tun?

edit: Kann mir noch jemand erklären, wie man den Parameter dieser Funktion zu intepretieren hat?
float (*e)(float (const int&));Danke
-
im std Namensraum gibt es eine struct die "plus" heißt, deswegen weiß der Compiler nicht, was du meinst
Der Parameter ist selbst wieder eine Funktion, die einen const int& nimmt und float zurückgibt.greetz KN4CK3R
-
Ok, danke! Noch eine letzte Frage. Wie ist die Aufrufkonvention einer solcher Funktion. So, kommt nämlich ein Castingfehler:
#include <iostream> float (*e)(float (const int&)); float plus(const int& x) { return 1 + x; } float foo(float x(const int&)) { return 1 + x(1); } int main() { float a = 10.0; e = foo; std::cout << e(plus(a)) << std::endl; //Fehler! return 0; }Danke
-
Pass mit den Fachwörtern auf:
Aufrufkonvention (calling convention): bedeutet etwas anderes
Castingfehler: Du verwendest keinen Cast, das ist wenn schon ein Typfehler.Was denkst du denn, was
plus(a)für einen Typ hat?
-
#include <iostream> float plus( const int & x ) { return 1 + x; } typedef float ( *plus_t )( const int & ); float foo( plus_t x, float a ) { return 1 + x( a ); } typedef float ( *foo_t )( plus_t, float ); int main() { float a = 10.0f; foo_t e = foo; std::cout << e( plus, a ) << '\n'; }
-
freakC++ schrieb:
edit: Kann mir noch jemand erklären, wie man den Parameter dieser Funktion zu intepretieren hat?
float (*e)(float (const int&));Der Parameter dieser Funktion ist ein Funktionszeiger auf eine Funktion die
- einen
floatzurückgibt - und eine Const-Referenz auf einen
intals Parameter nimmt.
Edit³:
Vielleicht wird es deutlicher wenn du den Funktionsparameter mal aus der Definition rausnimmst:float (const int&)Dann ist es nur noch eine leicht zu lesene Signatur.
- einen