【问题标题】:Why is template name available in derived class (the base class is an instance of the template)?为什么派生类中有模板名称(基类是模板的实例)?
【发布时间】:2019-07-28 20:17:35
【问题描述】:

我遇到了这段代码(用基本类型进行了简化):

template <typename T>
class Base {
  T t;
};

class Derived : public Base<short> {
 public:
  using Base<short>::Base;
};

int main() {
  Derived::Base<long long> x;
  printf("%lu\n", sizeof(x));
  return 0;
}

它编译并工作(输出为 8,即 long long 的大小)。似乎我可以使用Derived::Base 为任何类型T 获得Base&lt;T&gt;,即使Derived 只是Base&lt;short&gt; 的子类。 (在我遇到的代码中,Base 本身对main 是不可见的。)

但是,我不太明白这个语法及其工作原理。

Derived::Base 是模板名称、类还是函数(ctor)?这似乎是一个模板名称。模板名称是否在所有实例化此模板的类中可用(例如模板名称 BaseBase&lt;T&gt; 中,对于所有类型 T)?我很混乱。对 cppreference 或 C++ 标准的任何解释或指针表示赞赏。

【问题讨论】:

  • 我认为 Derived::Base 让你创建一个 Base 类型而不是 Dervied 类型 :)
  • 既是模板名也是类。取决于你如何使用它。
  • @cpplearner 如果你知道答案,你应该把它作为答案发布。

标签: c++ templates using


【解决方案1】:

来自en.cppreference.com/injected-class-name

在以下情况下,注入的类名被视为类模板本身的模板名:

  • 后面是
  • [..]

所以Base&lt;T&gt; 中的Base 根据上下文是一个类或模板名称。

【讨论】:

    猜你喜欢
    • 2017-01-13
    • 2019-11-09
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    相关资源
    最近更新 更多