文脈上、私は非線形方程式系を解くクラスを作成しようとしています(ルートファインダ)。このために私のインターフェースは以下の通りです:コンストラクタtakeはEigenベクトルをとり、解決するシステムであるEigenベクトルを返す関数をとり、func
に格納し、newt
メンバ関数はEigenベクトル(初期推測)、その最初の推測でアルゴリズムを実行し、func(r) = {0, 0, ..., 0}
のような固有ベクトルr
を返します。固有値ベクトルを引数とし、固有ベクトルを別のクラス/関数に返す関数を渡す方法
here:MatrixBase
のインスタンス化を行うテンプレート関数を記述する指示に従って、クラスの関数を記述しました。私の質問は、私もクラスに関数を渡したい場合、私は何か似たようなやり方をしますか?私が試したもっとも明白なアプローチは、プライベートなstd::function
オブジェクトを格納し、その関数で行ったのと同様の方法でテンプレート化することです。それはうまくいかなかったし、進める方法がわからない。
class Newt {
private:
template<typename TR, typename T1, typename T2, typename T3>
tuple<TR,bool> lnsrch(const MatrixBase<T1> &xold, const double fold, const MatrixBase<T2> &g, MatrixBase<T3> &p, const double stepmax);
template <typename TR, typename T1, typename T2>
TR fdjac(const MatrixBase<T1> &x, const MatrixBase<T2> &fvec);
template <typename TR, typename T1>
std::function<TR(MatrixBase<T1>)> func;
public:
template <typename TR, typename T1>
Newt(std::function<TR(MatrixBase<T1>)> f) : func(f) { };
template <typename T1, typename T2>
tuple<T1,bool> newt(const MatrixBase<T2> &xx);
};
私は次のエラーを取得:
g++-6 -c -Wall -O2 -march=native -flto newt.cpp
In file included from newt.cpp:8:0:
newt.h:218:40: error: data member ‘func’ cannot be a member template
std::function<TR(MatrixBase<T1>)> func;
^
newt.h: In constructor ‘Newt::Newt(std::function<TR(Eigen::MatrixBase<U>)>)’:
newt.h:222:46: error: class ‘Newt’ does not have any field named ‘func’
Newt(std::function<TR(MatrixBase<T1>)> f) : func(f) { };
^~~~
make: *** [newt.o] Error 1
任意のアイデア?私は何をしたいのですか?私が遂行しようとしていることを達成するための代替方法(任意の与えられた関数 "Eigen_Vector f(Eigen_Vector x)
"でアルゴリズムを実行するクラスを書く)?