2014-10-22 2 views
2

Я задаюсь вопросом, почему следующий код работает:Typedef из шаблонного класса внутри класса

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

'A' и' A 'являются взаимозаменяемыми в рамках' A'. – 0x499602D2

ответ

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 s для того же типа (что только сам A<T>). Поэтому ваш пример успешно компилируется.

Возможно, кто-то другой может процитировать из соответствующей части стандарта. Надо сказать, что я знаю, что это область, в частности, где я видел ошибки в некоторых старых компиляторах в прошлом, где A не рассматривается как эквивалент A<T> внутри определения шаблона.

+3

[temp.local]/p3: * Введенное имя класса шаблона класса или специализации шаблона шаблона может использоваться либо как имя шаблона , либо имя типа, где бы оно ни было в области. * –

+0

@PiotrS .: Благодаря; у вас впечатляющая скорость. –

Смежные вопросы