我试图在C++类中实现一个成员函数,该类具有auto参数(lambda)和带有默认值的int参数.像这样的东西:
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);
}
Run Code Online (Sandbox Code Playgroud)
但是,像这样的简单测试无法编译:
#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;
}
Run Code Online (Sandbox Code Playgroud)
编译器(MinGW 7.2.0,flags:-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
Run Code Online (Sandbox Code Playgroud)
我真心不明白这个错误.有人可以解释一下这个错误的原因以及如何修复它?先感谢您.
Edg*_*jān 10
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);
}
Run Code Online (Sandbox Code Playgroud)
另一种可能的方法是使用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);
}
Run Code Online (Sandbox Code Playgroud)
最后,你可以使用指向函数的指针,但它太C了 ...
如果您想扩展有关将函数传递给函数的知识,那么Vittorio Romeo的这篇文章给出了一个很好的解释+一些基准.