C2276或C3867 C 中的编译器错误

C2276 or C3867 compiler errors in C++

本文关键字:编译器 错误 C3867 C2276      更新时间:2023-10-16

我需要将类成员函数'曲线'发送到另一个函数'娱乐',但是在编译过程中我会遇到错误。如何正确编码?

使用地址'&'结果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);
}

curveTest类的成员函数,因此您需要具有可以调用curveTest实例。

您可以将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);
}

如果您可以更改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,我认为应该是。