我正在尝试在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);
}
然而,像这样的简单测试无法编译:
#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,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
我真心不明白这个错误。有人可以解释一下这个错误的原因以及如何修复它?提前谢谢。
答案 0 :(得分:10)
class LinkedList {
head: Nodule;
append(appendedNodule: Nodule) {
if (!this.head) {
this.head = appendedNodule;
}
let current: Nodule = this.head;
while (current.next) {
current = current.next;
};
current.next = appendedNodule;
}
}
class Nodule {
data: number;
next: Nodule;
constructor(data) {
this.data = data;
this.next = null;
}
}
参数是 gcc 扩展名。这意味着它不是解决问题的标准兼容方式。
我不确定上述错误的确切原因是什么,但您可能会对模板成员函数实现相同的效果,效果很好:
auto
另一种可能的方法是使用std::function
(这意味着一些性能开销):
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);
}
最后,您可以使用指向函数的指针,但它也是 C 方式......
如果您想扩展有关将函数传递给函数的知识,Vittorio Romeo的this article给出了一个很好的解释+一些基准。