C++具有自动参数和默认参数的成员函数
C++ member function with auto and default arguments
我正在尝试在具有自动参数(lambda(和具有默认值的int参数的C++类中实现一个成员函数。像这样:
class Base {
public:
int add_one(auto fobj, int b=3);
};
int Base::add_one(auto add_fcn, int b) {
return add_fcn(1, b);
}
但是,像这样的简单测试无法编译:
#include <iostream>
class Base {
public:
int add_one(auto fobj, int b=3);
};
int Base::add_one(auto add_fcn, int b) {
return add_fcn(1, b);
}
int main() {
int ans;
auto add_fcn = [](int a, int b) -> int {return a + b;};
Base obj;
ans = obj.add_one(add_fcn);
std::cout << ans << "n";
return 0;
}
编译器(MinGW 7.2.0,标志:-std=c++14(给我的错误如下:
error: call to 'int Base::add_one(auto:2, int) [with auto:1 = main()::<lambda(int, int)>]' uses the default argument for parameter 2, which is not yet defined
我真诚地不明白这个错误。有人可以解释一下此错误的原因以及如何修复吗?提前谢谢你。
auto
参数是gcc扩展。这意味着它不是解决问题的标准兼容方法。
我不确定上述错误的确切原因是什么,但您可能会使用效果良好的模板成员函数达到相同的效果:
class Base {
public:
template<typename F>
int add_one(F fobj, int b = 3);
};
template<typename F>
int Base::add_one(F add_fcn, int b) {
return add_fcn(1, b);
}
魔杖盒示例
另一种可能的方法是使用 std::function
(这意味着一些性能开销(:
class Base {
public:
int add_one(std::function<int(int, int)> fobj, int b = 3);
};
int Base::add_one(std::function<int(int, int)> add_fcn, int b) {
return add_fcn(1, b);
}
魔杖盒示例
最后,你可以使用指向函数的指针,但它太 C 方式了......
如果你想扩展将函数传递给函数的知识,维托里奥·罗密欧的这篇文章给出了一个很好的解释+一些基准。
相关文章:
- 使函数参数默认为周围范围
- 如何将值传递给其参数(默认参数)
- 当“std::make_index_sequence”和“std::index_sequence”用于模板参数默认类型时
- C ,构造器中允许的参考参数默认值
- 哪些规则控制参数默认赋值?
- 错误:上一个规范后给出的参数默认参数
- 是否可以设计一个包含模板参数默认值的类
- 构造函数中参数C++默认值
- 如何设置依赖于其他参数的参数默认值
- C++模板参数默认函数实现
- QInput对话框参数默认值
- g++4.8.2上列表方法参数默认初始化时出错
- 在函数定义中指定参数默认值会导致错误 C2143:语法错误:'='之前缺少')'
- 函数模板:将第一个模板参数默认为第二个
- 模板模板参数默认可以引用其他模板类型的参数
- 参数默认为先例参数的值
- 如何修改一个类,使它只有一个成员函数,所有参数默认
- 内置类型的模板参数默认值
- 是否可以使用构造函数或对象作为其他类方法的参数默认值?
- 模板参数默认为更高版本