C++ 在C语言中,将函数指针赋给适当类型的变量会得到;无法转换。。。“在任务中”;

C++ 在C语言中,将函数指针赋给适当类型的变量会得到;无法转换。。。“在任务中”;,c++,c,function-pointers,C++,C,Function Pointers,以下面的C/C++代码为例: #include <stdlib.h> int inc(int i) { return i+1; } // int→int, like abs() // baz is bool→(int→int) int (*baz(bool b))(int) { return b ? &abs : &inc; } int main() { int (*foo(bool))(int); // foo is &(bool→(int→in

以下面的C/C++代码为例:

#include <stdlib.h>

int inc(int i) { return i+1; }  // int→int, like abs()
// baz is bool→(int→int)
int (*baz(bool b))(int) { return b ? &abs : &inc; }

int main() {
  int (*foo(bool))(int);  // foo is &(bool→(int→int))
  foo = baz;
}
自己检查一下:它声称无法转换的两种类型完全相同。那么,为什么它声称它们是不相容的呢

编辑1:使用
typedef
s(推荐)时,问题消失,如下所示:

int main() {
  typedef int (*int2int)(int);
  typedef int2int (*bool2_int2int)(bool);
  bool2_int2int foo;
  foo = baz;
}
编辑2:当然,编译器是对的。正如许多人指出的那样,我的原始代码的问题在于
main()
中的
foo
是函数的声明,而不是函数指针。因此,赋值中的错误不是类型冲突,而是赋值给函数,这是不可能的。正确的代码是:

#include <stdlib.h>

int inc(int i) { return i+1; }  // int→int, like abs()
// baz is bool→(int→int)
int (*baz(bool b))(int) { return b ? &abs : &inc; }

int main() {
  int (*(*foo)(bool))(int);  // foo is &(bool→(int→int))
  foo = &baz;
}
#包括
int inc(int i){return i+1;}//int→int,比如abs()
//巴兹是个笨蛋→(int)→int)
int(*baz(bool b))(int){return b?&abs:&inc;}
int main(){
int(*(*foo)(bool))(int);//foo是&(bool)→(int)→int))
foo=&baz;
}

代码实际上是错误的。问题是这一行:

int (*foo(bool))(int);  // foo is &(bool→(int→int))
。。。这并不意味着你认为这意味着什么。它被解释为一个名为“foo”的函数的声明。这很有道理。想想看——如果你想向前声明“baz”,你会把
int(*baz(bool))(int),对吗?另外,由于baz是一个返回函数指针的函数,而foo是一个指向返回函数指针的函数的指针,您不认为语法会更复杂吗

您将foo声明为与baz类型相同的函数,而不是指向与baz类型相同的函数的指针

从您的编译器中,第一条错误消息是有用的-它告诉您
函数赋值
,即您试图赋值给函数,这是一个错误

我甚至不打算在没有typedefs的情况下编写正确的解决方案:-)下面是一些编译的代码,我认为使用typedefs是正确的:

#include <stdlib.h>
#include <stdbool.h>

typedef int(*IntReturnsInt)(int);

int inc(int i) { return i+1; } 
IntReturnsInt baz(bool b) { return b ? &abs : &inc; }

int main() {
  IntReturnsInt (*foo)(bool b);
  foo = baz;
}
#包括
#包括
类型定义int(*IntReturnsInt)(int);
int inc(int i){return i+1;}
IntReturnsInt baz(bool b){return b?&abs:&inc;}
int main(){
输入返回(*foo)(布尔b);
foo=baz;
}

在本例中,双函数指针的概念更清楚一些-
IntReturnsInt
是函数指针类型,
foo
是指向返回
IntReturnsInt
的函数的指针。。。phew:-)

这是一个函数声明

int (*foo(bool))(int);
如果要声明函数指针,应执行以下操作:

int (*(*foo)(bool))(int);
#包括
#包括
int inc(int i){return i+1;}//int→int,比如abs()
//巴兹是个笨蛋→(int)→int)
int(*baz(bool b))(int){return b?&abs:&inc;}
int main(){
int(*(*foo)(bool))(int);//foo是&(bool)→(int)→int))
foo=baz;
返回0;
}
因此,有一些次要问题给核心问题蒙上了阴影。您的“bool”被解释为默认的-
int
非类型化参数,因为实际的内置参数是“bool”,由先前缺少的
\include
人性化。堆栈上的对象缺少指针声明,这混淆了它符合上面静态内存中实函数对象类型的能力


一旦我加入
,错误就转移到“需要左值”投诉,因为只有一个函数声明,而没有指针对象。上面的代码编译时不会出现警告或错误。

很难确定,但我认为这更接近OP的意图:

// baz is a function returning a pointer to a function
int (*baz(bool b))(int) { return b ? &abs : &inc; }

int main() {
  // foo is a pointer to a function
  int (*foo)(int) ;
  foo = baz(true); // Now foo is equal to &abs
}

您不能分配给函数类型(
int(*foo(bool))(int);
),您需要使用指向函数的指针

int (*(*foo)(bool))(int);
foo = &baz;

哇,那有点像意大利面条。那
int(*(*foo)(bool))(int)呢;foo=&baz?为什么没有typedef?声明typedef并创建指向此类函数的指针<代码>类型定义int intfunc(int)
typedef intfunc*bazlike(bool)有助于使事情更清楚。错误的是错误消息。您使用的是哪个版本的g++?通过我的(4.4)我得到:“错误:函数'int(*foo(bool))(int)的赋值”和“错误:无法将'int(*(*)(bool))(int)'转换为'int(*(bool))(int)的赋值”,我认为这是正确的。在main()函数中,您声明的是一个函数,而不是一个局部变量。Achille,我也使用了4.4,但我认为您指的是我的代码中的另一个错误:赋值“foo=baz”,它在我的主要错误得到解决后作为一个简短形式工作。您是否将其更正为“foo=&baz”?
foo
更改为函数指针类型
foo=baz是完全合法的。表达式中的函数名被转换为指向函数类型的指针(除非它是一元
&
sizeof
的参数)。eegg:的确如此。忘了提了,对不起。
// baz is a function returning a pointer to a function
int (*baz(bool b))(int) { return b ? &abs : &inc; }

int main() {
  // foo is a pointer to a function
  int (*foo)(int) ;
  foo = baz(true); // Now foo is equal to &abs
}
int (*(*foo)(bool))(int);
foo = &baz;