如何修复Eigen3中的“非类型模板参数不是常量表达式”错误?

10
我很少使用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个回答

8

无法实现。模板参数必须是编译时常量。

const int SIZE_ = 2; 是编译时常量,因此在这里 SIZE_ 不可能有一个与2不同的值。编译器知道这一点,并可以安全地构建类型 Eigen::Matrix<float, 2, 2>

const int SIZE_ = someNonConstantExpression; 不是编译时常量。它不能用于模板参数。

无法欺骗编译器以接受需要编译时常量的运行时值,例如在模板中。但是,Eigen具有动态矩阵(大小无需在编译时指定),您可以使用它们。


3

我认为@MaxLanghof已经解决了这个问题,但如果你仍然希望矩阵大小的值来自另一个方法(但仍然是在编译时),你可以像下面这样使用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
我强烈建议编写 constexpr int SIZE_ = ...,这样你就可以立即获得错误(如果 getSizeOfMatrix() 不是 constexpr),而不仅仅是在尝试声明 test 时。 - chtz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接