C++ 类内模板化类的Typedef

C++ 类内模板化类的Typedef,c++,templates,syntax,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::c

我想知道为什么下面的代码可以工作:

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;
}
模板
甲级{
公众:
typedef A*指针;
typedef A*其他指针;
};
int main()
{
A A;
A::指针b=&A;
A::OtherPointer c=&A;

std::cout之所以有效,是因为在类模板
A
中,类型名
A
是完整描述的类型
A
的别名。上面的模板定义相当于:

template <class T>
class A {
  public:
  typedef A<T>* Pointer;
  typedef A<T>* OtherPointer;
};
模板
甲级{
公众:
typedef A*指针;
typedef A*其他指针;
};
当您以这种方式编写时,可以看到,
A::Pointer
A::OtherPointer
是同一类型的
typedef
s(即
A
本身)。因此,您的示例编译成功


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

A
A
A在
A
[temp.local]/p3的范围内,它们都是可互换的:类模板或类模板专门化的注入类名可以用作模板名或类型名,无论它在什么范围内。@PiotrS.:谢谢;您的速度令人印象深刻。