类中的模板类的Typedef

时间:2014-10-22 14:24:30

标签: c++ templates syntax

我想知道为什么以下代码有效:

template <class T>
class A {
  public:
  typedef A* Pointer;
  typedef A<T>* OtherPointer;
};

int main()
{
  A<double> a;
  A<double>::Pointer b = &a;
  A<double>::OtherPointer c = &a;
  std::cout << b << " " << c << std::endl;
}

OtherPointer的语法对我来说是合乎逻辑的。我对Pointer的问题感到疑惑。类的名称隐式是类定义中的模板类型吗?如果是这样,为什么其他语法也能正常工作?

1 个答案:

答案 0 :(得分:4)

它的工作原理是因为在类模板A<T>中,类型名称A是完整描述类型A<T>的别名。上面的模板定义等同于:

template <class T>
class A {
  public:
  typedef A<T>* Pointer;
  typedef A<T>* OtherPointer;
};

正如您在以这种方式撰写时所看到的那样,A<T>::PointerA<T>::OtherPointer为同一类型的typedef(仅A<T>本身)。因此,您的示例已成功编译。

其他人可能会引用此标准的相关部分。应该说,我知道这是一个特别的领域,我在过去的一些较旧的编译器中看到了错误,其中A在模板定义中不被视为等同于A<T>