error C2664: no se puede convertir el parámetro 1 de 'int' a 'int (__cdecl *) (int)'
-
27-10-2019 - |
Pregunta
tiene problemas para pasar una función como parámetro de otra función ...
ERROR: Error 1 error C2664: 'envoltorio' : no se puede convertir el parámetro 1 de 'int' a 'int (__cdecl *) (int)'
int inc( int n )
{
return n + 1 ;
}
int dec( int n )
{
return n - 1 ;
}
int wrapper( int i, int func(int) )
{
return func( i ) ;
}
int main(){
int a = 0 ;
a = wrapper( 3, inc( 3 ) ) ;
return 0 ;
}
Solución
Estás pasando el resultado de una llamada de función inc(3)
a wrapper
, NO un puntero de función como se espera.
a = wrapper(3, &inc) ;
Otros consejos
Su llamada pasa un número entero, el valor de retorno de llamar a inc(3)
, es decir, 4.
Eso no es un puntero de función.
Quizás quisiste decir:
a = wrapper(3, inc);
Esto funcionaría y asignaría un valor al llamar a int
con el parámetro 3
.
La línea:
a = wrapper( 3, inc( 3 ) ) ;
es efectivamente:
a = wrapper(3, 4);
Creo que te refieres a:
a = wrapper(3, inc);
Esto pasa un puntero a la función inc () como segundo argumento para wrapper ().
Tal como está ahora, wrapper
toma un int
y un puntero a una función que toma un int
y devuelve un int
.Estás intentando pasarle un int y un int, porque en lugar de pasar el un puntero a la función , estás llamando a la función y pasando el valor de retorno (unint
).Para que su código funcione como (creo) que espera, cambie su llamada a wrapper
a esto:
a = wrapper(3, &inc);
Tuve este error en mi programa:
error C2664: 'glutSpecialFunc' : cannot convert parameter 1 from 'void (__cdecl *)(void)' to 'void (__cdecl *)(int,int,int)'
porque escribí la definición del método más tarde que el método principal. cuando corté el método principal y lo pegué después de la definición de función, el error se eliminó.