Я столкнулся с проблемой перегрузки функции для различных типов собственных матриц (точнее, столбца и матрицы). Перегрузка терпит неудачу, когда ввод является результатом некоторой простой арифметики. В частности:
#include <Eigen/Eigen>
#include <iostream>
typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> MatD;
typedef Eigen::Matrix<double, Eigen::Dynamic, 1, Eigen::ColMajor> ColD;
ColD multiply(const ColD &A){ return 2. * A; }
MatD multiply(const MatD &A){ return 2. * A; }
int main()
{
ColD A = ColD::Ones(10);
MatD B = MatD::Ones(10,10);
// overload is correct
std::cout << multiply(A) << std::endl;
std::cout << multiply(B) << std::endl;
// compiler error: "error: call to 'multiply' is ambiguous"
std::cout << multiply(A+A) << std::endl;
std::cout << multiply(B+B) << std::endl;
return 0;
}
т.е. перегрузка на основе A
и B
скомпилирована правильно. Но компилятор не может определить правильную перегрузку, когда я делаю A+A
и B+B
. Я мог бы решить эту проблему, выполнив две строки, возможно, используя некоторую временную переменную, но этого я не хочу делать. Как я могу заставить эту перегрузку работать для этого «однострочного»?
Полагаю, это особенность Эйгена, но я до сих пор не могу точно понять, какая именно особенность и как я могу ее избежать.