我想知道为什么以下代码有效:
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
。类的名称是否隐式包含在类定义中的模板化类型?如果是这样,为什么其他语法也能正常工作?
之所以起作用,是因为在类模板中A<T>
,类型名称A
是完整描述的type的别名A<T>
。您上面的模板定义等同于:
template <class T>
class A {
public:
typedef A<T>* Pointer;
typedef A<T>* OtherPointer;
};
正如你所看到的,当你把它写这种方式,A<T>::Pointer
并且A<T>::OtherPointer
是typedef
S为同一类型(这只是A<T>
本身)。因此,您的示例编译成功。
也许其他人可以引用此标准的相关部分。应该说,我知道这是一个领域,尤其是我过去在一些较早的编译器中看到的错误,在该领域中,该错误A
不等同于A<T>
模板定义内部。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句