Избегание неоднозначных параметров в шаблонных собственных функциях с помощью MSVS - PullRequest
1 голос
/ 23 октября 2019

Я пишу некоторые функции, которые должны принимать Eigen::Array в качестве ввода. Массивы имеют постоянный размер, но размер является параметром шаблона и должен вычитаться из входных данных. При компиляции с MSVS мне нужно указать размер функции, иначе это приведет к ошибке.

#include <Eigen/Core>

template<unsigned short t_iSize>
void foo(const Eigen::Array<unsigned short, t_iSize, 1>&)
{

}

int main()
{
    Eigen::Array<unsigned short, 3, 1> test;
    // foo(test);    // Compiler errors C2672 and C2784
    foo<3>(test);    // Giving the size solves the errors
}

Размер можно вычесть из переменной test, но, похоже,ошибка при вычислении аргументов шаблона 4 и 5 для массива.

Ошибка C2672: "foo": не найдено соответствующей перегруженной функции.

Ошибка C2784: "void foo (const Eigen):: Array &) ": не удалось вывести аргумент шаблона для" const Eigen :: Array & "from" Eigen :: Array ".

Можно ли избежать этой проблемы при получении Eigen :: Array, или мне нужно принять Eigen :: ArrayBase в качестве параметра функции? Я бы хотел этого избежать, поскольку он скрывает тот факт, что функция принимает только этот конкретный тип массивов.

Редактировать:

Как отметил Jarod42, параметр шаблона должен иметь тип int. Visual Studio может скомпилировать код с этой ошибкой. Однако он не может вывести параметр _Rows, где другие компиляторы могут это сделать.

Здесь вы можете увидеть проблему, с которой я столкнулся.

1 Ответ

2 голосов
/ 23 октября 2019

Объявление Eigen::Array равно

template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
class Eigen::Array;

Ваша функция использует неверный тип для строки, unsigned short должно быть int.

template <int t_iSize>
void foo(const Eigen::Array<unsigned short, t_iSize, 1>&)
{
    // ...
}

Демо

В качестве обходного пути для вашей проблемы с Msvc вы можете сделать:

  • применить значение по умолчанию вручную:

    template <int t_iSize>
    void bar(const Eigen::Array<unsigned short, t_iSize, 1, 0, t_iSize, 1>&) {
      // ...
    }
    
  • или добавьте дополнительный шаблон (и, следовательно, код является еще более общим):

    template <int t_iSize, int Options, int MaxRows, int MaxCols>
    void foo(const Eigen::Array<unsigned short, t_iSize, 1, Options, MaxRows, MaxCols>&) {
      // ...
    }
    

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...