По умолчанию, если T
является параметром шаблона, как в вашем примере, предполагается, что T::some_member
не называет тип. Вы должны явно указать, что это так, добавив префикс typename
:
typename T::const_iterator myIterator;
Это решает некоторые проблемы с синтаксическим анализом, как в следующем примере
// multiplication, or declaration of a pointer?
T::const_iterator * myIterator;
Чтобы компилятор мог разобрать это даже до создания экземпляра шаблона, вы должны помочь ему и использовать typename
, в том числе в тех случаях, когда он не будет неоднозначным, как в первом случае выше. Шаблон FAQ имеет более глубокое понимание этого.