Есть две проблемы.Во-первых, prod
является шаблонизированной функцией, поэтому вы не можете просто передать prod
в качестве указателя на функцию.Вместо этого вам нужно будет передать prod<...>
с заполненными конкретными параметрами шаблона.
Однако в этом случае это все равно не решит вашу проблему, потому что даже с указанными параметрами шаблона prod
все еще имеет несколько перегрузок.и компилятор не может определить, какой он должен использовать.Это можно исправить, объявив указатель на функцию, который указывает аргументы и тип возвращаемого значения.Однако, поскольку ublas
использует сложное метапрограммирование шаблонов, это будет крайне уродливо, и я бы не рекомендовал его.Вместо этого я написал бы функцию-оболочку около prod
для вызова конкретной перегрузки, которую вы хотите.Вот довольно обобщенная обертка, которая должна работать с любой матрицей Ublas:
template <class E1, class E2>
typename boost::numeric::ublas::matrix_matrix_binary_traits<
typename E1::value_type, E1,
typename E2::value_type, E2>::result_type
my_prod(const boost::numeric::ublas::matrix_expression<E1>& e1,
const boost::numeric::ublas::matrix_expression<E1>& e2)
{
return prod(e1, e2);
}
Затем вы можете вызвать my_pow
, используя my_prod
, например:для интереса, вот объявление указателя функции, которое вам нужно будет передать для разрешения параметров и перегрузок шаблона.Это объявляет указатель функции с именем prod_ptr
, который указывает на конкретную перегрузку prod
, которую вы хотите:
matrix_matrix_binary_traits<matrix<int>::value_type, matrix<int>, matrix<int>::value_type, matrix<int> >::result_type
(*prod_ptr)(const matrix_expression<matrix<int> >&, const matrix_expression<matrix<int> >&) =
&prod<matrix_matrix_binary_traits<matrix<int>::value_type, matrix<int>, matrix<int>::value_type, matrix<int> >::result_type, matrix<int>, matrix<int> >;
Тогда вы сможете вызвать my_pow
, используя указатель на функцию:
my_pow(m, 2, prod_ptr);