【问题标题】:How to fix 'non-type template argument is not a constant expression' in eigen3?如何修复 eigen3 中的“非类型模板参数不是常量表达式”?
【发布时间】:2019-10-23 12:01:54
【问题描述】:

我还是 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_ 将由可能具有不同值的变量启动)。

【问题讨论】:

    标签: c++ c++11 eigen3


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我真的建议写constexpr int SIZE_ = ...,这样你就会立即得到错误(如果getSizeOfMatrix()不是constexpr),而不仅仅是在尝试声明test时。
      猜你喜欢
      • 1970-01-01
      • 2013-09-21
      • 2016-04-06
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 2021-02-04
      相关资源
      最近更新 更多