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

Why Eigen doesn't need template keywords for using template function call of Matrix?

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

我有点知道 why/when 我们需要 template 个关键词。但是,现在我不明白为什么当我忘记使用 template:

时上面的代码没有发出错误消息
m.cast<double>();

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

为什么 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>();
}