std::function
新しいC++11変数を適切に使用する方法について質問があります。インターネットを検索していくつかの例を見てきましたが、それらは私が検討している使用例をカバーしていないようです。この最小の例を見てください。ここで、関数fdiff
はで定義された有限前方差分アルゴリズムの実装ですnumerical.hxx
(これは問題ではありません。任意の関数を取得して渡したいという文脈上の理由を示したかっただけです)。 。
#include <functional>
#include <iostream>
#include <cmath>
#include "numerical.hxx"
int main()
{
double start = 0.785398163;
double step = 0.1;
int order = 2;
std::function<double(double)> f_sin = std::sin;
std::cout << fdiff(start, step, order, f_sin) << std::endl;
return 0;
}
上記のプログラムをコンパイルしようとすると、エラーが発生します(clang ++で)
test.cpp:11:32: error: no viable conversion from '<overloaded function type>' to
'std::function<double (double)>'
std::function<double(double)> f_sin = std::sin;
^ ~~~~~~~~
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../include/c++/4.7.1/functional:2048:7: note:
candidate constructor not viable: no overload of 'sin' matching
'nullptr_t' for 1st argument
function(nullptr_t) noexcept
^
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../include/c++/4.7.1/functional:2059:7: note:
candidate constructor not viable: no overload of 'sin' matching 'const
std::function<double (double)> &' for 1st argument
function(const function& __x);
^
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../include/c++/4.7.1/functional:2068:7: note:
candidate constructor not viable: no overload of 'sin' matching
'std::function<double (double)> &&' for 1st argument
function(function&& __x) : _Function_base()
^
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../include/c++/4.7.1/functional:2092:2: note:
candidate template ignored: couldn't infer template argument '_Functor'
function(_Functor __f,
^
1 error generated.
またはg++から
test.cpp: In function ‘int main()’:
test.cpp:11:45: error: conversion from ‘<unresolved overloaded function type>’ to non-scalar type ‘std::function<double(double)>’ requested
問題を理解しているのstd::sin
は、標準ライブラリにテンプレートクラスとして実装されているためですが、関数参照を取得するために十分な特殊化を行うために何をする必要があるのか理解できないようです。auto
また、新しいキーワードを使用&std::sin
したり、ポインタを取得したりするなど、さまざまなことを試しましたが、すべて同じタイプのエラーが発生します。