我仍然是本征库和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;
}