为何使用std::function多模板参数写法会编译失败?
关于std::function模板参数的编译错误解答
std::function的标准定义:C++11及后续标准中,
std::function仅接受单个模板参数,这个参数必须是完整的函数类型签名(比如void(int)表示返回void、接受一个int参数的函数),而非将返回值和参数列表拆分为多个独立的模板参数。代码错误原因:你写的
std::function<void, int>是错误用法——这里把返回值void和参数int拆成了两个模板参数,但编译器只认单个完整的函数类型作为模板参数,所以会报错。关于“两种实现形式”的误解:你看到的不同文档里的“两种形式”,大概率是文档在解释
std::function时的表述差异。比如有些文档会把函数类型拆成“返回值”和“参数列表”两部分讲解,但这不是模板参数的实际写法。标准里std::function的模板参数始终是单个完整的函数签名。正确代码示例:
#include <functional> int main(int argc, char*argv[]) { // 模板参数是完整的函数类型 void(int),表示接受int参数、无返回值的函数 std::function<void(int)> cb; }
如果需要适配多参数的函数,比如返回int、接受double和std::string的函数,写法是:
std::function<int(double, std::string)> func;
内容的提问来源于stack exchange,提问作者Mario Klebsch
相关产品推荐
相关产品推荐

