【问题标题】:Why is no empty argument list required inside this class definition?为什么在这个类定义中不需要空参数列表?
【发布时间】:2014-09-22 04:37:31
【问题描述】:

当仅使用标准类型参数实例化具有模板类类型的变量时,语法如下所示:

template<typename Arg = int>
class Templ;

Templ<>& myTempl;

省略空参数列表&lt;&gt; 应该会产生编译错误,因为需要模板参数列表。

但显然(至少在 VS2013 下),以下声明确实 不需要 需要模板参数列表:

template<typename Arg> //" = int" left out
class Templ{
    Templ& myTempl; //no <> here
};

但是为什么会这样呢?根据 IntelliSense,编译器选择了正确的类型 (Templ&lt;int&gt;),因此它按预期工作,但成员声明不应该仍然需要一个空参数列表吗?

编辑: 不,它没有按预期工作。我检查得不够彻底。当悬停在Templ&lt;short&gt;::myTempl 线上时,IntelliSense 显示其类型为short

【问题讨论】:

    标签: c++ visual-studio class templates c++11


    【解决方案1】:

    类名被注入到类作用域中

    9 类 [类]

    2 类名被插入到声明它的作用域中 在看到类名之后立即。 类名也是 插入到类本身的范围内;这被称为 注入类名。出于访问检查的目的, injection-class-name 被视为公共成员名称。一种 类说明符通常称为类定义。一类 被认为是在其类说明符的右大括号之后定义的 即使它的成员函数通常还没有 定义。可选的属性说明符序列属于类; 属性说明符序列中的属性在其后 命名时考虑类的属性。

    类模板也是如此

    14.6.1 本地声明的名称 [temp.local]

    1 与普通(非模板)类一样,类模板有一个 注入类名(第 9 条)。注入的类名可以用作 模板名称或类型名称。当它与一个 模板参数列表,作为模板的模板参数 模板参数,或作为最终标识符 朋友类模板声明的详细类型说明符,它 指类模板本身。 否则,就相当于 模板名称后跟类的模板参数 &lt;&gt; 中包含的模板。

    这样你就可以使用Templ,你的意思是Templ&lt;Arg&gt;

    【讨论】:

    • 因此,只有在使用 Arg = int 进行测试时,OP 声称它选择 Templ&lt;int&gt; 才是正确的。
    • @hvd 我的声明是基于 IntelliSense 的声明,即 Templ&lt;int&gt; 实际上已被选中,但我现在应该学会在与模板相关的问题上不要相信它。
    • @iFreilicht Arg 的实际参数当然只能在调用代码中知道,如果没有指定,它将是 int,但 Intellisense 可能会搞砸。跨度>
    • @iFreilicht 我想你只是在看Templ&lt;int&gt;::myTempl,在这种情况下Templ&lt;int&gt;Templ&lt;Arg&gt; 是同一类型。 IntelliSense 是否真的说过(例如)Templ&lt;short&gt;::myTempl 具有 Templ&lt;int&gt; 类型?
    • @hvd 不,它做得对。我应该检查一下。
    【解决方案2】:

    这称为注入的类名

    在类模板中,没有任何模板参数列表的模板名称指的是当前实例化,所以Templ 表示Templ&lt;Arg&gt;(而不是 Templ&lt;&gt;Templ&lt;int&gt;所以不一定相同)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-05
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 2020-09-17
      相关资源
      最近更新 更多