2012-01-30 3 views
1

Можно создать дубликат:
Where and why do I have to put the “template” and “typename” keywords?C++ Typedef подпись

Я просматривал this boost::multi_array example и имеет typedef, такие как:

template <typename Array> 
... 
typedef typename Array::template subarray<2>::type::iterator iterator2; 

Я понимаю, что

typedef typename <type> <new_type>; 

подпись выглядит, но это имеет три вещи после typedef typename, и я не могу найти в Интернете, что бы это называлось или что он делает. Может кто-то сломать то, что делает этот typedef, и почему у него есть три вещи? Я не думаю, что это зависит от скорости.

ответ

2

template в Array::template работает точно так же, как typename вы уже понимаете. Его роль в typedef заключается в том, чтобы сказать (пообещать) компилятору, что subarray является фактически шаблоном, и поэтому <2> имеет смысл из-за этого.

Это точно так же, как роль typename ключевого слова в этой typedef, но с эффектом говорит компилятору, что это template вместо типа.

1

Это старая

typedef typename <type> <new_type>; 

вы уже поняли.

type является typename Array::template subarray<2>::type::iterator

new_type является iterator2

1

Всякий раз, когда вы пишете шаблон функции/класса, компилятор иногда нуждается в помощи. В этом примере Array::template является типом внутри шаблонизированного типа, что требует наличия typename.

Без этой потребности, что ЬурейеЕ бы просто:

typedef Array::template subarray<2>::type::iterator iterator2; 

Однако это (обычно генерировать) ошибка компиляции. Чтобы исправить эту ошибку, просто вставьте ключевое слово typename.

typedef typename Array::template subarray<2>::type::iterator iterator2; 
0

typename является помощником в этом случае, чтобы позволить компилятору знать это тип. Ключевое слово используется в шаблонах в случаях, когда компилятору не удалось выбрать между зависимым типом и квалифицированным типом.