为何将自定义div类对象赋值给std::function时触发参数不足编译错误?
问题:赋值自定义可调用结构体到std::function时触发“参数不足”编译错误
代码示例
#include <functional> int add(int i, int j) { return i + j; } struct div { int operator()(int denominator, int divisor) { return denominator / divisor; } }; int main() { auto mod = [](int i, int j) { return i % j; }; std::function<int(int, int)> f1 = add; std::function<int(int, int)> f2 = div(); std::function<int(int, int)> f3 = mod; return 0; }
编译错误信息
function.cc: In function ‘int main()’: function.cc:17:43: 错误:函数‘div_t div(int, int)’的实参太少 17 | std::function<int(int, int)> f2 = div(); | ^ In file included from /usr/include/c++/9/cstdlib:75, from /usr/include/c++/9/ext/string_conversions.h:41, from /usr/include/c++/9/bits/basic_string.h:6496, from /usr/include/c++/9/string:55, from /usr/include/c++/9/stdexcept:39, from /usr/include/c++/9/array:39, from /usr/include/c++/9/tuple:39, from /usr/include/c++/9/functional:54, from function.cc:1: /usr/include/stdlib.h:852:14: 注:在此处声明 852 | extern div_t div (int __numer, int __denom) | ^~~
原因分析
核心问题是名字冲突:
- 你自定义的结构体命名为
div,但C标准库的<stdlib.h>中已经存在一个全局div函数,它接受两个int参数,返回包含商和余数的div_t结构体。 - 由于
<functional>间接引入了<stdlib.h>,编译器解析div()时,优先匹配了标准库的div函数而非你自定义的结构体。此时div()被当作调用这个需要两个参数的函数,自然触发“实参太少”的错误。
解决方法
有三种可行的修复方式:
- 重命名自定义结构体:将
struct div改为struct Div或struct MyDiv,彻底避免名字冲突:struct MyDiv { int operator()(int denominator, int divisor) { return denominator / divisor; } }; // main中使用 std::function<int(int, int)> f2 = MyDiv(); - 用命名空间隔离:把自定义结构体放入专属命名空间,创建对象时显式指定命名空间:
namespace my_funcs { struct div { int operator()(int denominator, int divisor) { return denominator / divisor; } }; } // main中使用 std::function<int(int, int)> f2 = my_funcs::div(); - 显式指定结构体类型:创建对象时用
struct关键字明确告知编译器这是自定义结构体:std::function<int(int, int)> f2 = struct div();
内容的提问来源于stack exchange,提问作者Elgin Cahangirov
相关产品推荐
相关产品推荐

