如何修复 eigen3 中的'non-type template argument is not a constant expression'?



我仍然是本征库和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_将由可能具有不同值的变量启动)。

你不能。模板参数必须是编译时常量。

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

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

不能诱使编译器接受需要编译时值的运行时值,例如在模板中。但是,Eigen 具有动态矩阵(在编译时不需要知道大小),您可以使用它们来代替。

我认为@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;
}

相关内容

最新更新