无法将int(*(int))(int)转换为int(*(int))(int)

时间:2019-10-21 16:48:31

标签: c++

我正在尝试学习有关返回指向函数的指针的函数的信息,在尝试编译代码后,它给了我这种错误:

  

无法将分配中的int (*(int))(int)转换为int sum(int i){ return i+i; } int (*fp)(int) = sum; int (*someFunc(int))(int a){ return fp; } int main(){ int i = 1; int (*fp2(int))(int); fp2 = someFunc; return 0; }

我知道那两个{{1}}是同一件事,但是为什么会发生此错误?

我正在使用g ++编译此代码

{{1}}

我希望fp2是指向fp变量的指针,但这只会给我一些错误。

感谢您的帮助,谢谢

3 个答案:

答案 0 :(得分:3)

您将fp2定义为函数本身,而不是函数的指针,这意味着您无法为其分配。您需要使其成为函数的指针:

int (*(*fp2)(int))(int);
fp2 = someFunc;

更好的方法是使用typedef,这样代码就不会造成混乱:

typedef int func1(int);
typedef func1 *func2(int);

int sum(int i) {
    return i+i;
}

func1 *fp = sum;

func1 *someFunc(int a) {
    return fp;
}

int main() {
    int i = 1;
    func2 *fp2 = someFunc;
    return 0;
}

答案 1 :(得分:1)

似乎您的意思是以下

int (*( *fp2 ) (int))(int);

fp2 = someFunc;

即fp2应该声明为函数指针。否则,您将尝试将赋值运算符应用于函数。

您可以通过引入别名来简化声明。

例如

int sum(int i){
    return i+i;
}

using Fp = int( * )( int );

Fp fp = sum;

Fp someFunc(int){
    return fp;
}

int main() 
{
    Fp ( *fp2 ) (int);

    fp2 = someFunc;

    return 0;
}

答案 2 :(得分:0)

花了我一段时间来解决与函数指针有关的问题,但是我建议使用以下规则:(a)对任何允许将每种类型都视为一种类型的用户定义存储类使用typedef语句一件事(例如typedef struct _mystruct_ MyStruct;)。使用此快捷方式可以实现:(b)三部分表达式的每个部分(例如RETURN-TYPE (POINTER-DECLARATION)(LIST-OF-ARGUMENT-TYPES);)都应包含一组括号,但最左边的术语中应包含 no ,并且表达式的中间项是变量的名称(因此,容器中包含星号[{*]),例如int (*_mainPtr)(int, const char *[]);应该定义指向{{1 }}函数。