다음 코드를 컴파일하는 방법은 무엇입니까?
#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)
실제 문제는 호출자가 코드의 유일한 변경 사항이 주석 일 때 함수 내에서 사용할 Eigen 선형 대수 솔버 (예 : 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>>
템플릿 매개 변수로.
어떤 종류의 템플릿이 있는지 이해해야합니다. 이 경우 std::vector
에는 두 가지 유형 매개 변수가 있습니다.
template <typename T, template <typename, typename> class C>
C<T> foo()
{
return C<T>();
}
보다 일반적으로 비가 변 템플릿에도 허용되는 가변 서명을 사용하는 것이 좋습니다.
template <typename T, template <typename...> class C>
C<T> bar()
{
return C<T>();
}
용법:
foo<int, std::vector>(); // OK, returns std::vector<int, std::allocator<int>>
bar<int, std::vector>(); // OK, ditto
bar<int, std::set>(); // also OK
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다