C++函数指针赋值报错:bool*无法赋值给bool(*)(int)类型实体
报错根本原因
你在is_mate函数中定义的形参名is_white,和全局定义的is_white函数重名了,在is_mate函数的作用域内,形参会遮蔽全局的函数名:
- 你在
is_mate里写&is_white时,编译器会认为你是取bool类型的形参is_white的地址,类型为bool*,和你声明的函数指针类型bool (*)(int)不匹配,因此报错 - 而
cover_fields函数里的形参名是piece_is_white,没有和全局函数重名,所以能正常识别&is_white是取全局函数的地址,无报错
解决方案
两种方案二选一即可:
- 修改
is_mate的形参名,避免和全局函数重名,比如改成is_white_turn:
// 修改前 bool is_mate(int** board, bool is_white=true) // 修改后 bool is_mate(int** board, bool is_white_turn=true)
- 取全局函数地址时加全局作用域限定符
::,强制指定使用全局命名空间的is_white函数:
is_enemy = &::is_white;
额外逻辑错误提醒
你后续调用is_enemy函数指针时,括号位置写错了,会导致逻辑完全不符合预期:
// 错误写法:把 && 两侧的表达式全部塞进了is_enemy的参数里 is_enemy(board[row][col] && !is_checked(board, is_white)) // 正确写法:is_enemy只接收board[row][col]作为参数,再和后面的判断做&&运算 is_enemy(board[row][col]) && !is_checked(board, is_white)
你需要把所有调用is_enemy的位置的括号都修正过来,否则即使编译通过,功能也无法正常运行。
内容的提问来源于stack exchange,提问作者kims9
相关产品推荐
相关产品推荐

