在 C++ 中使用 std::bind 和 std::function 时出错
Error using std::bind and std::function in C++
我尝试在多元函数上尝试我的牛顿法片段,并使用了 std::bind
和 std::function
。但是我遇到了一个错误
error: conversion from 'std::_Bind_helper&, int>::type {aka
std::_Bind, int))(double, double,
double)>}' to non-scalar type 'std::function'
requested
此错误消息是什么意思,我应该如何修复我当前的代码?
#include <iostream>
#include<functional>
#include<cmath>
double newton(std::function<double(double)> F, std::function<double(double)> f,
double x=0, int maxiter=1000, double epsilon=0.001)
{
int n = 0;
while((n < maxiter) && (fabs(F(x)) > epsilon))
{
x = x - F(x) / f(x);
n++;
}
return x;
}
// I'd like to fix x and z at 1 and 2 and find root for y
double ftest(double x, double y, double z)
{
return x * x + (y * y - 2 * y - 4) + z * z;
}
// Partial derivative of ftest with regards to y
double ftest1(double y)
{
return 2 * y - 2;
}
int main()
{
using namespace std::placeholders;
std::function<double(double)> F = std::bind(ftest, 1, _2, 2);
std::function<double(double)> f = ftest1;
std::cout << newton(F, f);
return 0;
}
这里的问题:
std::function<double(double)> F = std::bind(ftest, 1, _2, 2);
是 F
是一个函数,它接受一个 double
类型的参数,但是你的绑定表达式涉及 _2
- 它指的是传递给函数对象的第二个参数bind()
returns。即 second 参数。基本上,你正在构造这个函数对象,大致是:
struct {
template <class T, class U>
auto operator()(T, U arg) {
return ftest(1, arg, 2);
}
};
该对象有两个参数。 std::function<double(double)>
不允许这样做 - 它要求您的可调用对象允许单个参数。
简单的修复方法是修复占位符:
std::function<double(double)> F = std::bind(ftest, 1, _1, 2);
或者,更好的是,完全不使用 bind()
而更喜欢 lambda:
std::function<double(double)> F = [](double y) { return ftest(1, y, 2); }
我尝试在多元函数上尝试我的牛顿法片段,并使用了 std::bind
和 std::function
。但是我遇到了一个错误
error: conversion from 'std::_Bind_helper&, int>::type {aka std::_Bind, int))(double, double, double)>}' to non-scalar type 'std::function' requested
此错误消息是什么意思,我应该如何修复我当前的代码?
#include <iostream>
#include<functional>
#include<cmath>
double newton(std::function<double(double)> F, std::function<double(double)> f,
double x=0, int maxiter=1000, double epsilon=0.001)
{
int n = 0;
while((n < maxiter) && (fabs(F(x)) > epsilon))
{
x = x - F(x) / f(x);
n++;
}
return x;
}
// I'd like to fix x and z at 1 and 2 and find root for y
double ftest(double x, double y, double z)
{
return x * x + (y * y - 2 * y - 4) + z * z;
}
// Partial derivative of ftest with regards to y
double ftest1(double y)
{
return 2 * y - 2;
}
int main()
{
using namespace std::placeholders;
std::function<double(double)> F = std::bind(ftest, 1, _2, 2);
std::function<double(double)> f = ftest1;
std::cout << newton(F, f);
return 0;
}
这里的问题:
std::function<double(double)> F = std::bind(ftest, 1, _2, 2);
是 F
是一个函数,它接受一个 double
类型的参数,但是你的绑定表达式涉及 _2
- 它指的是传递给函数对象的第二个参数bind()
returns。即 second 参数。基本上,你正在构造这个函数对象,大致是:
struct {
template <class T, class U>
auto operator()(T, U arg) {
return ftest(1, arg, 2);
}
};
该对象有两个参数。 std::function<double(double)>
不允许这样做 - 它要求您的可调用对象允许单个参数。
简单的修复方法是修复占位符:
std::function<double(double)> F = std::bind(ftest, 1, _1, 2);
或者,更好的是,完全不使用 bind()
而更喜欢 lambda:
std::function<double(double)> F = [](double y) { return ftest(1, y, 2); }