c++ - 为什么 Eigen 不需要模板关键字来使用 Matrix 的模板函数调用?

标签 c++ templates eigen

使用 c++17 和 Eigen 3.4.0 的 MWE

#include <Eigen/Dense>
using namespace Eigen;

int main()
{
  Matrix<float, 2, 2> m;
  m << 1.0, 2.0, 3.0, 4.0;
  m.cast<double>();
  // m.template cast<double>();
  return 0;
}

阅读 Eigen 文档后 TopicTemplateKeyword和 热门SO答案where-and-why-do-i-have-to-put-the-template-and-typename-keywords

我有点知道为什么/什么时候我们需要 template 关键字。但是,现在我不明白为什么当我忘记使用 template 时上面的代码没有发出错误消息:

m.cast<double>();

看起来它符合 Eigen 文档中“必须使用模板”的每条规则。

  • m 是依赖名
  • cast是成员模板

为什么 Eigen 不强制我在调用 cast 之前添加 template

我最好的猜测是 m 可能不是真正的相关名称(我可能是错的)。如果有人可以向我展示源代码行,那就太好了。我觉得这是一个不错的 FEATHER,我想作为作者编写类似的代码,让我的用户的生活更轻松。

最佳答案

m 不是从属名称。

如果依赖名称依赖于封闭模板的模板参数,则它们只能在模板内部有依赖名称。

例子:

template <typename T>
void foo()
{
  Matrix<T, 2, 2> m; // Note that `T` has to be involved.
  m << 1.0, 2.0, 3.0, 4.0;
  m.template cast<double>();
}

关于c++ - 为什么 Eigen 不需要模板关键字来使用 Matrix 的模板函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69807142/

相关文章:

c++ - 使用 C++ 成员函数处理采用简单静态函数指针的回调

c++ - 避免嵌入式目标上的虚函数

email - 在 http res 上下文之外劫持 expressjs View 引擎

c++ - 特征映射类 : mapping C-array to VectorXd pointer in an efficient way

c++ - 如何使在 Visual C++ 2010 中开发的解决方案在 Visual C++ 2012 中运行?

c++ - Wchar_t 为空,除非使用 "wcout"

c++ - 从函数参数推断模板类型

c++ - 构建通用重载运算符<<

c++ - 将特征矩阵映射到 C 数组

c++ - Eigen 矩阵分配需要很长时间——有解决办法吗?