1

次のコードをコンパイルするにはどうすればよいですか?

#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>>

テンプレートパラメータとして。

4

2 に答える 2