Функция шаблона с использованием заголовка Eigen - PullRequest
0 голосов
/ 08 мая 2018

Я хочу написать функцию, которая вычисляет норму вектора, определенного с помощью Eigen. Минимальный рабочий пример:

#include <iostream>
#include <Eigen/Dense>

using namespace Eigen;


template<typename t>
t norm( Matrix<t,Dynamic,1> RR ){
    t result = ( t ) 0;
    for ( auto i = 0 ; i < RR.rows(); i++ )
            result += RR( i ) * RR( i );
    }

    return result;
}


int main(){
    Matrix<float , 3 , 1 > test;
    test << 1,2,3;

    std::cout << test << std::endl;
    std::cout << norm( test ) << std::endl;
}

Если я скомпилирую этот код, я получаю следующую ошибку:

chem:~/programs/cpp/charge_ana> g++ -std=c++11 test.cpp -o test
test.cpp: In function ‘int main()’:
test.cpp:28:26: error: no matching function for call to    
‘norm(Eigen::Matrix<float, 3, 1>&)’
std::cout << norm( test ) << std::endl;
test.cpp:28:26: note: candidate is:
test.cpp:9:3: note: template<class t> t norm(Eigen::Matrix<Scalar, -1, 1>)
t norm( Matrix<t,Dynamic,1> RR ){
^
test.cpp:9:3: note:   template argument deduction/substitution failed:
test.cpp:28:26: note:   template argument ‘3’ does not match ‘#‘integer_cst’ not supported by dump_decl#<declaration error>’
std::cout << norm( test ) << std::endl;
                      ^
test.cpp:28:26: note:   ‘Eigen::Matrix<float, 3, 1>’ is not derived from ‘Eigen::Matrix<Scalar, -1, 1>’

Есть ли у кого-нибудь подсказка, что делать? Потому что я не знаю, что еще попробовать и не понимаю сообщения об ошибке во время компиляции

1 Ответ

0 голосов
/ 08 мая 2018

Хотя Eigen::Matrix<float, 3, 1> можно преобразовать в Eigen::Matrix<float, Eigen::Dynamic, 1>, это не будет выполнено автоматически до вывода шаблона. Вы можете позвонить:

norm<float>(test)

или вы можете добавить другой параметр шаблона для размера:

template<typename t, int size>
t norm( const Matrix<t,size,1>& RR ){
    t result = RR.squaredNorm(); // this does the same as your loop

    return result;
}
...