错误 C2664:无法将参数 1 从“int”转换为“int (__cdecl *)(int)”

Posted

技术标签:

【中文标题】错误 C2664:无法将参数 1 从“int”转换为“int (__cdecl *)(int)”【英文标题】:error C2664: cannot convert parameter 1 from 'int' to 'int (__cdecl *)(int)' 【发布时间】:2011-06-13 14:52:09 【问题描述】:

在将函数作为另一个函数的参数传递时遇到了一些问题...

错误:错误 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 ;


【问题讨论】:

【参考方案1】:

您将函数调用 inc(3) 的结果传递给 wrapper,而不是预期的函数指针。

a = wrapper(3, &inc) ;

【讨论】:

【参考方案2】:

您的调用传递一个整数,即调用 inc(3) 的返回值,即 4。

那不是函数指针。

也许你的意思是:

a = wrapper(3, inc);

这会起作用,并使用参数3 为调用int 分配一个值。

【讨论】:

【参考方案3】:

行:

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

有效:

a = wrapper(3, 4);

我想你的意思是:

a = wrapper(3, inc);

这会将指向 inc() 函数的指针作为 wrapper() 的第二个参数传递。

【讨论】:

【参考方案4】:

就像现在一样,wrapper 采用 int 和一个指向函数的指针,该函数采用 int 并返回 int。您正在尝试向它传递一个 int 和一个 int,因为不是传递 指向函数的指针,而是 调用 函数并传递返回值(一个int)。要使您的代码按(我认为)您期望的那样工作,请将您对 wrapper 的调用更改为:

a = wrapper(3, &inc);

【讨论】:

非常感谢大家的快速回复..我以前遇到过这个问题,并且在不了解问题的情况下设法让它工作......现在它工作了,我明白为什么..再次感谢【参考方案5】:

我的程序中有这个错误:

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

因为我写的方法定义晚于主方法。 当我剪切主方法并在函数定义之后粘贴时,错误被删除。

【讨论】:

以上是关于错误 C2664:无法将参数 1 从“int”转换为“int (__cdecl *)(int)”的主要内容,如果未能解决你的问题,请参考以下文章

error C2664: “int CWnd::MessageBoxW(LPCTSTR,LPCTSTR,UINT)”: 无法将参数 1 从“const char [9]”转换为“LPCTSTR”

错误 C2664:“SQLGetData”:无法将参数 6 从“SDWORD *”转换为“SQLLEN *”

错误 C2664:无法将参数 2 从 'const ATL::CAdapt<ATL::CComPtr<IZipFileEntry>> *' 转换为 'ATL::CAdapt&l

error C2664: “int CWnd::GetWindowTextW(LPTSTR,int) const”: 不能将参数 1 从“char [10]”转换为“LP

error C2664: “CreateFileW”: 不能将参数 1 从“char *”转换为“LPCWSTR”

无法将参数 1 从 int 转换为 int && 错误 [重复]