ошибка C2664: невозможно преобразовать параметр 1 из 'int' в 'int (__cdecl *) (int)' - PullRequest
2 голосов
/ 13 июня 2011

возникли проблемы при передаче функции в качестве параметра другой функции ...

ОШИБКА: ошибка 1 ошибка C2664: «обертка»: невозможно преобразовать параметр 1 из «int» в «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 ;

}

Ответы [ 5 ]

5 голосов
/ 13 июня 2011

Вы передаете результат вызова функции inc(3) на wrapper, НЕ указатель на функцию, как ожидается.

a = wrapper(3, &inc) ;

1 голос
/ 29 мая 2012

У меня была эта ошибка в моей программе:

error C2664: 'glutSpecialFunc' : cannot convert parameter 1 from 'void (__cdecl *)(void)' to 'void (__cdecl *)(int,int,int)'

, потому что я написал определение метода позже, чем основной метод.когда я вырезал основной метод и вставил его позже определения функции, ошибка исчезла.

1 голос
/ 13 июня 2011

Строка:

 a = wrapper(  3, inc( 3 )  ) ;

эффективна:

a = wrapper(3, 4);

Я думаю, вы имеете в виду:

a = wrapper(3, inc);

Это передает указатель на inc ()действует как второй аргумент для wrapper ().

1 голос
/ 13 июня 2011

Как и сейчас, wrapper принимает int и указатель на функцию, которая принимает один int и возвращает int. Вы пытаетесь передать ему int и int, потому что вместо передачи указателя на функцию вы вызываете функцию и передаете возвращаемое значение (int). Чтобы ваш код работал так (как мне кажется), вы ожидаете, измените свой вызов на wrapper на этот:

a = wrapper(3, &inc);
1 голос
/ 13 июня 2011

Ваш вызов передает целое число, возвращаемое значение от вызова inc(3), т.е. 4.

Это не указатель функции.

Возможно, вы имели в виду:

a = wrapper(3, inc);

Это сработает, и присвойте a значению вызова int с параметром 3.

...