C++给带默认参数的成员函数取别名后调用报错如何解决?
问题原因
C++ 中默认参数是函数声明层面的属性,不属于函数本身的类型信息。你通过auto aliasFunction = Foo::bar获取的函数指针,类型为void(*)(int, int),完全丢失了默认参数的声明,因此编译器会要求调用时传入两个参数。
解决方案
方法1:使用Lambda包装(最简便)
如果你的编译环境支持C++11及以上标准,直接写一层Lambda转发即可保留默认参数:
const auto aliasFunction = [](int i, int j = 0) { Foo::bar(i, j); };
修改后直接调用aliasFunction(1)就可以正常运行。
如果是C++14及以上版本,还可以写更通用的无参数重复版本:
#include <utility> const auto aliasFunction = [](auto&&... args) { return Foo::bar(std::forward<decltype(args)>(args)...); };
该写法会自动转发所有传入参数,完全复用原函数的默认参数规则。
方法2:手动定义转发函数
也可以手动写一个全局/静态转发函数,效果和Lambda完全一致,无额外运行时开销:
void aliasFunction(int i, int j = 0) { Foo::bar(i, j); }
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

