C++ std::function类型转换错误:函数指针转非标量类型失败如何解决?
问题描述
我之前写了一段演示函数嵌套调用的代码可以正常运行:
#include <iostream> #include <functional> int thirds(int a) { return a + 1; } template <typename T, typename B , typename L> int hello(T x, B y, L func) { int first = x + 1; int second = y + 1; int third = func(6); return first + second + third; } int add() { std::function<int(int)> myfunc = thirds; return hello(1, 1, myfunc); // pass thirds function from here } int main() { std::cout << add(); return 0; }
现在我想传递一个参数为Number类引用、返回值为std::vector<uint8_t>的thirds函数,修改后的完整代码如下:
#include <stdio.h> #include <iostream> #include <functional> class Number{ public: int z = 5; }; std::vector<uint8_t> thirds(Number &N) { std::vector<uint8_t> z; z.push_back(N.z); return z ; } template <typename T, typename B , typename L> int hello(T x, B y, L func) { int first = x + 1; int second = y + 1; Number N; std::vector<uint8_t> third = func(N); return first + second ; } int add() { std::function<std::vector<uint8_t>(Number)> myfunc = &thirds; return hello(1, 1, myfunc); } int main() { std::cout << add(); return 0; }
编译时出现错误:
error: conversion from ‘std::vector<uint8_t> (*)(Number&)’ to non-scalar type ‘std::function<std::vector<uint8_t>(Number)>’ requested
std::function<std::vector<uint8_t>(Number)> myfunc = &thirds;
错误原因
你的std::function签名和thirds函数的签名不匹配:
thirds函数的参数是**Number&(左值引用)**- 但你声明的
std::function是**std::vector<uint8_t>(Number)**,参数是值传递的Number
这两种签名不兼容,编译器无法将接受左值引用的函数指针转换为接受值传递的std::function类型。
解决方法
有两种可行的修正方案:
方案1:修正std::function的签名,匹配引用类型
把std::function的参数改为Number&,和thirds的参数一致:
int add() { std::function<std::vector<uint8_t>(Number&)> myfunc = &thirds; return hello(1, 1, myfunc); }
方案2:直接传递函数指针,省略std::function
因为hello是模板函数,可以自动推导函数指针类型,没必要用std::function包装,直接传递thirds即可:
int add() { return hello(1, 1, &thirds); // 或者直接写thirds }
额外注意
原代码还缺少#include <vector>和#include <cstdint>头文件,这两个是使用std::vector和uint8_t必需的,需要补充到代码开头。
内容的提问来源于stack exchange,提问作者Senor Maldona
相关产品推荐
相关产品推荐

