当前位置: 首页 > 知识库问答 >
问题:

为什么模板参数不允许参数列表后的typename

虞承泽
2023-03-14

使用模板中的模板语法时

错误:模板参数在参数列表后需要“类”

在声明模板参数的基本情况下,关键字typenameclass在其他任何地方都是可以互换的。

您可以争辩说,使用模板时的要求暗示您需要传递类类型,但情况并非总是如此(尤其是在C 11引入模板类型别名之后)。

template <template <typename> class T> // 'class' keyword required.
struct Foo {
    using type = T<int>;
};

template <typename T>
using type = T (*)();

using func_ptr_t = Foo<type>::type;
  • 模板声明中不允许使用typename有什么具体原因吗

共有2个答案

敖硕
2023-03-14

我在寻找这个限制背后的理性[…]

在引入C 11之前,可以传递给模板参数的唯一模板是类模板。这就是为什么强制使用关键字class。此外,关键字typename意味着模板参数是对任意类型的替换,而不是模板,因此在该上下文中使用typename只会模糊类型名称和(类)模板之间的界限。这是可以理解的。

如今,此类参数可以是类模板或别名模板的名称,而且由于这些模板甚至没有远程连接,因此关键字class的实施或多或少已经过时。提案N4051选择将其更改为C 1Z。

慕通
2023-03-14

简短回答:因为标准上这么说。

更详细的回答:在标准化之前,C模板要求所有模板参数使用class关键字。然而,为了强调模板也可以是非类(即内置)类型的事实,引入了另一个关键字typename。然而,在C 98中,模板参数只能是类类型,这就是为什么没有在该上下文中添加typename关键字的原因。

输入C 11及其新的要素模板别名,该别名现在还引入了非类模板,因此引入了非类模板参数:

template<typename T> struct A {};
template<typename T> using B = int;

template<template<typename> class X> struct C;
C<A> ca; // ok
C<B> cb; // ok, not a class template
template<template<typename> typename X> struct D; // error, cannot use typename here

上述示例取自当前的C 1z提案N4051,标题为模板参数中的Allowtypename,并建议精确地允许。

Clang 3.5 SVN现在通过-std=c 1z标志支持此功能。

 类似资料:
  • 最近,我开始学习,并琢磨出函数可能是这样没有参数编写的: 这是怎么可能的,以及在引擎盖下正在做什么?不允许我们这样做。

  • 我有以下代码: 这段代码会导致编译错误。使用< code>g -std=c 1z编译时,错误显示如下: 使用< code>clang -std=c 1z时,错误为: 我在MSYS2 MinGW-w64环境中运行这些。我的GCC版本是GCC 7.1.0,我的Clang版本是4.0.0;我在GCC和Clang中使用的标准库是与我的GCC编译器捆绑在一起的libstdc。 在我看来,对函数templat

  • 如果我有一些琐碎的东西,比如(为了澄清,我并不是说这是一个好的实现,只是一个演示成员函数部分模板专门化失败的示例): 我无法通过执行以下操作来专门化每个功能: 不幸的是,C标准不允许: 14.5.5.31、类模板局部特化成员的模板参数列表应与类模板局部特化的模板参数列表匹配类模板局部特化成员的模板参数列表应与类模板局部特化的模板参数列表匹配。 因此,唯一的解决方案(据我所知)是使用类型特征或用样板

  • 问题内容: 来自C语言的Go语言最值得注意的方面之一是,如果在其中声明了一个未使用的变量,编译器将不会编译您的程序。那么,如果在函数中声明了一个未使用的参数,那么为什么要构建此程序呢? 问题答案: 没有正式的原因,但是在golang-nuts上给出的原因是: 未使用的变量始终是编程错误,而编写不使用其所有参数的函数是很常见的。 可以将这些参数保留为未命名(使用_),但这可能会与诸如 func fo

  • 问题内容: W3指定表列(带有元素)仅允许使用四个CSS规则- 边框,背景,宽度和可见性。 有人知道这个决定的原因吗?如果可以使用边框和背景,为什么不使用字体和颜色呢? 问题答案: IanHixie在这里详细解释:为什么只有四个属性应用于表列的奥秘。相关报价: 文本的颜色取决于其元素的“颜色”属性。除非指定,否则“ color”属性(基本上)默认为“ inherit”,这意味着“采用父元素的值”。

  • 问题内容: 我的问题是我尝试在查询中插入包含char的文本 我试图在char之前加上双反斜杠//,但仍然无法正常工作。 问题答案: 在这里,Hibernate正在解析一个插入,该插入包含其中带有冒号的硬编码值。如果您重写插入以使用参数,则Hibernate将不会在语句中看到该值。