如何将本征矩阵行引用作为向量传递给在另一个.cpp中实现的func?

问题描述

希望您能帮助我。 我的问题来自另一个回答here

的问题

在该页面的内部 rhashimoto 为类似问题提供了很好的答案:

#include <iostream>
#include <Eigen/Core>

template<typename V>
void set_row(V&& v) {
   v = Eigen::Vector3f(4.0f,5.0f,6.0f);
}

int main() {
   Eigen::Matrix3f m = Eigen::Matrix3f::Identity();
   set_row(m.row(1));

   std::cout << m;
   return 0;
}

问题在于何时需要将set_row函数放入另一个cpp文件通过这种方式,编译器会收到未定义的参考错误 我找到了解决here

方法

他们说您可以解决的地方:

  1. 将set_row函数移到头文件中。好!我试过了,但是可以,但是我不喜欢它!或者
  2. 在set_row函数的cpp文件中显式实例化模板。这就是我要做的。我尝试没有成功。

您能告诉我如何达到最后一点吗?

解决方法

最好在标头中使用模板。

如果必须将其放在CPP文件中,则可以按照建议使用模板函数和显式实例化。关键是使用Eigen Block type

#include <Eigen/Dense>

template <int N,int M>
void set_row(Eigen::Block<Eigen::Matrix<float,N,M>,1,M> row) {
  // Note: this implementation is not correct in the general case.
  row = Eigen::Vector3f(4.0f,5.0f,6.0f);
}

// Explicit instantiation for fixed 3-by-3 case.
template void set_row(Eigen::Block<Eigen::Matrix<float,3,3>,3> row);

// Explicit instantiation for dynamic N by M case.
// Note that current implementation will not work.
template void set_row(Eigen::Block<Eigen::Matrix<float,Eigen::Dynamic,Eigen::Dynamic>,Eigen::Dynamic> row);

工作中的Godbolt示例:https://godbolt.org/z/T4EYsc