Как исправить «нетипичный аргумент шаблона не является константным выражением» в eigen3? - PullRequest
1 голос
/ 23 октября 2019

Я все еще новичок в библиотеке Eigen и C ++. Я тестирую некоторый код, и я не понимаю, почему этот

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

using namespace std;

int main()
{
  int a = 2;
  const int SIZE_ = a;
  Eigen::Matrix<float, SIZE_, SIZE_> test;
  return 0;
}

не компилируется, а этот

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

using namespace std;

int main()
{
  const int SIZE_ = 2;
  Eigen::Matrix<float, SIZE_, SIZE_> test;
  return 0;
}

работает отлично. Как я мог изменить первый код так, чтобы он работал (то есть SIZE_ был бы инициирован переменной, которая потенциально могла бы иметь другое значение).

Ответы [ 2 ]

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

Я думаю, что @MaxLanghof разрешил проблему, но если вы все еще хотите, чтобы значение размера Matrix пришло из другого метода (но все еще во время компиляции), вы можете использовать метод constexpr, подобный этому:

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

using namespace std;

constexpr int getSizeOfMatrix()
{
   return 2*3;
}

int main()
{
  const int SIZE_ = getSizeOfMatrix();
  Eigen::Matrix<float, SIZE_, SIZE_> test;
  return 0;
}
1 голос
/ 23 октября 2019

Вы не можете. Аргументы шаблона должны быть константами времени компиляции.

const int SIZE_ = 2; - это константа времени компиляции, нет никакого способа, которым SIZE_ может когда-либо иметь значение, отличное от 2 здесь. Компилятор знает это и может безопасно создать тип Eigen::Matrix<float, 2, 2>.

const int SIZE_ = someNonConstantExpression; не является константой времени компиляции. Его нельзя использовать в аргументах шаблона.

Вы не можете заставить компилятор принимать значения времени выполнения, где требуются значения времени компиляции, например, в шаблонах. Однако в Eigen есть динамические матрицы (размер которых не требуется знать во время компиляции), которые вы можете использовать вместо этого.

...