C ++中的C2276或C3867编译器错误

时间:2019-05-11 05:39:57

标签: c++ class compiler-errors

我需要将类成员函数“ curve”发送到另一个函数“ fun”,但是在编译过程中会出错。如何正确编码?

使用地址'&'导致C2276,而不使用它-C3867。

class Test
{
public:
    double v;

    double curve(double x)
    {
        return x + v;
    }

    Test(double z)
    {
        v = z;
    }
};

double fun(double(*f)(double), double x)
{
    return f(x);
}

void main()
{
    Test d(2.0);

    double r = fun(&d.curve, 3.0);
}

2 个答案:

答案 0 :(得分:2)

curveTest类的成员函数,因此您需要有一个Test实例,可以在其上调用curve

您可以更改fun作为成员函数的第一个参数指针,并在第二个参数传递对Test实例的引用时,结果代码如下:

class Test {
public:
    double v;

    double curve(double x) {
        return x + v;
    }

    Test(double z) {
        v = z;
    }
};

double fun(  double(Test::*f)(double)  , Test& obj, double x) {
    return (obj.*f)(x);
}

int main()
{
    Test d(2.0);
    double r = fun(&Test::curve, d, 3.0);
}

答案 1 :(得分:1)

如果您可以更改fun签名,则 rafix07 的答案是完美的。

如果您不想更改fun的参数数量,则可能需要编写如下内容:

double fun(double(*f)(double), double x)
{
    return f(x);
}

int main() // not void
{
    Test d(2.0);
    double r = fun([d](double double_){ return d.curve(double_); }, 3.0);
    std::cout << r;
}

可悲的是,它不起作用,因为只有在不使用捕获的情况下,lambda才能存储在函数指针中。

因此,您有2种解决方案:

1)模板

// Must be in .hpp
template <class T>
double fun(T f, double x)
{
    return f(x);
}

int main() // not void
{
    Test d(2.0);
    double r = fun([d](double double_) mutable { return d.curve(double_); }, 3.0);
}

2)std :: function

#include <functional>
double fun(std::function<double(double)> f, double x)
{
    return f(x);
}

注意:,您必须使用mutable,因为double curve(double x)不是const,我认为应该是这样。