我正在寫一些函數模板使用犰狳線性代數庫,但它遇到一些錯誤。我仍然在學習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...
// ....
}
任何解決方案?
似乎'運算符*(double,Mat)'返回一個懶惰評估,而不是直接的'mat '...... –
Jarod42
錯誤是如此清楚。模板可以是'int'。 'int'是否有成員'n_rows()'? – manetsus
@manetsus號''int'沒有'n_rows',但'Mat'有。在第二種情況下,因爲我只傳遞'Mat'類(或'int * Mat <>'...),我認爲只有該函數的版本纔會被實例化。 @ Jarod42是的,這可能是問題所在。 –