使用父模板类的非依赖嵌套类作为子类中的成员

Using a nondependent nested class of a parent template class as a member in a child class

本文关键字:子类 成员 嵌套 依赖      更新时间:2023-10-16

我浏览了C++常见问题解答中的C++模板部分,发现了这个关于使用父模板类的非依赖嵌套类作为子类成员的示例(不编译的代码(:

template<typename T>
class B {
public:
  class Xyz { ... };  ← type nested in class B<T>
  typedef int Pqr;    ← type nested in class B<T>
};
template<typename T>
class D : public B<T> {
public:
  void g()
  {
    Xyz x;  ← bad (even though some compilers erroneously (temporarily?) accept it)
    Pqr y;  ← bad (even though some compilers erroneously (temporarily?) accept it)
  }
};

C++常见问题35.18

不幸的是,这也不起作用,因为这些名字(你是准备好的你坐下来了吗?(不一定是类型。"啊?!?"你说"不是打字?!?"你惊呼道。"太疯狂了,任何傻瓜都能看见是类型;看!!!"你抗议。对不起,事实是他们可能不是类型。原因是可以有专业化例如B,其中B::Xyz是数据成员。由于这种潜在的专业化,编译器不能假设Xyz是一个类型,直到它知道T。解决方案是给出编译器通过typename关键字提供提示:

因此,作者提出了there can be a specialization of B<T>, say B<Foo>, where B<Foo>::Xyz is a data member, for example.。这是我真正不理解的部分——如何专门化一个模板类(不从中继承(另一个成员添加到该类中,而在另一个专门化中(例如B<Baz>(却不存在?当然,这是假设D这样的东西是静态的,如果不存在。

我是不是错过了什么?

当显式专门化类模板时,您正在为给定的模板参数完全重新定义该类。这里有一个简单的例子:

template <typename T>
struct foo
{
  typedef T type;
};
template <>
struct foo<int>
{
  static int type;
};

现在,如果我用除int之外的任何其他模板参数实例化foo,那么成员type就是一个类型。否则,它是int数据成员。