我想知道为什么以下代码有效:
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
的问题感到疑惑。类的名称隐式是类定义中的模板类型吗?如果是这样,为什么其他语法也能正常工作?
答案 0 :(得分:4)
它的工作原理是因为在类模板A<T>
中,类型名称A
是完整描述类型A<T>
的别名。上面的模板定义等同于:
template <class T>
class A {
public:
typedef A<T>* Pointer;
typedef A<T>* OtherPointer;
};
正如您在以这种方式撰写时所看到的那样,A<T>::Pointer
和A<T>::OtherPointer
为同一类型的typedef
(仅A<T>
本身)。因此,您的示例已成功编译。
其他人可能会引用此标准的相关部分。应该说,我知道这是一个特别的领域,我在过去的一些较旧的编译器中看到了错误,其中A
在模板定义中不被视为等同于A<T>
。