You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:31:03