次のコードをコンパイルするにはどうすればよいですか?
#include "vector"
template<
template<class> class Container
> Container<int> f(int i) {
return Container<int>{i};
}
int main() {
return f<std::vector>(1)[0];
}
GCC-4.8.2 は不平を言います:
error: no matching function for call to 'f(int)'
note: template<template<class> class Container> Container<int> f(int)
実際の問題は、コードの唯一の変更がコメントになる場合に、関数内で使用する固有線形代数ソルバー (例: http://eigen.tuxfamily.org/dox/classEigen_1_1BiCGSTAB.html ) を呼び出し元が指定できるようにする方法です。次から別の行を出力します。
Eigen::BiCGSTAB<Eigen::SparseMatrix<Scalar_T>> solver;
//Eigen::ConjugateGradient<Eigen::SparseMatrix<Scalar_T>> solver;
//Eigen::SimplicialCholesky<Eigen::SparseMatrix<Scalar_T>> solver;
現在、関数は次のように開始されます。
template<
template<class> class Eigen_Solver_T,
class Scalar_T
> std::vector<Scalar_T> solve(...)
、呼び出し元にも Eigen::SparseMatrix を与える必要はなく、代わりに与えるだけ
Eigen::BiCGSTAB<Eigen::SparseMatrix<Scalar_T>>
テンプレートパラメータとして。