为什么不能在函数中声明模板?

dub*_*nde 23 c++ templates

阅读C++模板:完整指南,它说

请注意,模板不能在函数中声明

它不对书中的任何其他章节或外部资源给出解释和/或交叉引用.

有人可以帮忙解释一下.可能它会在本书后面解释,但还没有.如果先前解释过,我一定错过了它.

例:

int main()
{
  class DummyClass  //  This compiles ok
  {
    int object;
  };

  template <typename T> //  compile error "expected primary-expression before "template""
  class DummyTemplate
  {
    T object;
  };

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我也不明白gcc的错误信息.错误消息说:

expected primary-expression before "template"
Run Code Online (Sandbox Code Playgroud)

Jam*_*nze 39

问题可能与实现模板的历史方式有关:早期实现技术(以及今天仍在使用的一些技术)要求模板中的所有符号都具有外部链接.(实例化是通过在单独的文件中生成等效代码来完成的.)函数内定义的名称永远不会有链接,也不能在定义它们的范围之外引用.

  • 这应该是公认的答案,因为它至少试图给出其背后的推理,而不仅仅是"因为标准这样说". (6认同)

D. *_*riy 10

答案“因为标准是这么说的”,当然是正确的,但让我们考虑一下通用 lambda。

据我所知,在 C++14 和 C++17 中,通用 lambda 是编写类似模板代码的唯一方法:

    auto lambda = [](auto x) { };
    lambda.operator()<int>(0);
Run Code Online (Sandbox Code Playgroud)

从技术上讲,您可以用它编写任何类型的模板代码。尽管您必须努力解决此方法的各种限制。

不过在 C++20 中这会更简单。使用泛型 lambda 中的模板参数列表,您将能够编写如下代码:

    auto size = []<class T>() { return sizeof(T); };
    static_assert(4 == size.operator()<int>());
Run Code Online (Sandbox Code Playgroud)

GCC 已经支持这种语法。