Я пишу некоторые шаблоны функций, используя библиотеку линейной алгебры Armadillo, но он сталкивается с некоторыми ошибками. Я все еще изучаю C++ и его аспекты, поэтому буду очень благодарен за любые возможные решения. Большинство моих функций как следующий,Шаблоны функций в C++ с Armadillo
template<typename T1>
void some_function(const Mat<T1> & p)
{
unsigned int n = p.n_rows;
// do some stuffs...
// ....
}
Моя основная функция содержит:
Mat<double> A = ones<Mat<double>>(4,4);
int a(2);
some_function(A); // runs perfectly
some_function(a*A); // compilation error as follows
test_function.hpp:35:8: note: template argument deduction/substitution failed:
test.cpp:22:17: note: ‘arma::enable_if2<true, const arma::eOp<arma::Mat<double>, arma::eop_scalar_times> >::result {aka const arma::eOp<arma::Mat<double>, arma::eop_scalar_times>}’ is not derived from ‘const arma::Mat<eT>’
some_function(a*A);
Если изменить функцию следующим образом:
template<typename T1>
void some_function(const T1 & p)
{
unsigned int n = p.n_rows;
// do some stuffs...
// ....
}
Затем он дает ошибку компиляции, как следует:
test_function.hpp: In instantiation of ‘bool some_function(const T1&) [with T1 = arma::eOp<arma::Mat<double>, arma::eop_scalar_times>]’:
test.cpp:22:17: required from here
test_function.hpp:37:26: error: ‘const class arma::eOp<arma::Mat<double>, arma::eop_scalar_times>’ has no member named ‘n_rows’
unsigned int n = p.n_rows;
Но функции без шаблонов работают отлично, например
void some_function(const Mat<double> & p)
{
unsigned int n = p.n_rows();
// do some stuffs...
// ....
}
Любые решения?
Кажется, что 'operator * (double, Mat)' возвращает ленивую оценку, а не непосредственно 'Mat ' ... –
Jarod42
Ошибка настолько ясна. Шаблон может быть 'int'. У 'int' есть член' n_rows() '? – manetsus
@manetsus № 'int' не имеет' n_rows', но 'Mat' имеет. Во втором случае, поскольку я только передаю класс 'Mat' (или' int * Mat <> '...), я думаю, будет создана только эта версия функции. @ Jarod42 Да, это может быть проблема. –