带有auto和default参数的C ++成员函数

时间:2018-01-07 18:02:31

标签: c++ class lambda

我正在尝试在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

我真心不明白这个错误。有人可以解释一下这个错误的原因以及如何修复它?提前谢谢。

1 个答案:

答案 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

Wandbox example

另一种可能的方法是使用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);
}

Wandbox example

最后,您可以使用指向函数的指针,但它也是 C 方式......

如果您想扩展有关将函数传递给函数的知识,Vittorio Romeo的this article给出了一个很好的解释+一些基准。