首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么不能在函数中声明模板?

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

Stack Overflow用户
提问于 2010-08-10 20:55:40
回答 7查看 11.8K关注 0票数 28

阅读C++ Templates: The Complete Guide,它说

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

它不会对书中的任何其他章节或外部资源进行解释和/或交叉引用。

有人能帮我解释一下吗。这可能会在书的后面解释,但还没有。如果我之前解释过了,我一定是错过了。

示例:

代码语言:javascript
复制
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;
}

我也不理解来自gcc的错误消息。错误消息显示:

代码语言:javascript
复制
expected primary-expression before "template"
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-05-17 22:50:09

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

票数 49
EN

Stack Overflow用户

发布于 2019-01-11 23:25:44

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

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

代码语言:javascript
复制
    auto lambda = [](auto x) { };
    lambda.operator()<int>(0);

从技术上讲,你可以用它来编写任何类型的模板代码。不过,您必须努力绕过此方法的各种限制。

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

代码语言:javascript
复制
    auto size = []<class T>() { return sizeof(T); };
    static_assert(4 == size.operator()<int>());

GCC已经支持这种语法。

票数 6
EN

Stack Overflow用户

发布于 2010-08-10 21:07:27

简而言之,这是因为编写c/c++编译器和标准的人希望它是这样的。函数中的模板必须被认为太混乱和/或难以理解或解析,所以他们禁止这样做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3449112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档