Ошибки компилятора C2276 или C3867 в C ++ - PullRequest
1 голос
/ 11 мая 2019

Мне нужно отправить функцию-член класса «кривая» другой функции «веселье», но я получаю ошибки во время компиляции. Как правильно это кодировать?

Использование адреса '&' приводит к 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 ]

2 голосов
/ 11 мая 2019

curve является функцией-членом класса Test, поэтому вам необходим экземпляр 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 голос
/ 11 мая 2019

Если вы можете изменить подпись 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;
}

К сожалению это не работает , потому что лямбда может быть сохранена в указателе функции, только если она не использует захват.

Итак, у вас есть 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) стандартная функция :: 1022 *

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

Примечание: вы должны использовать mutable, потому что double curve(double x) не const, я думаю, что это должно быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...