Возможно, самый простой способ - это понять, что ::
является оператором области, а не только для пространств имен.
std::vector<char>
является классом, и поэтому у него есть своя собственная область действия класса (3.3.6 вC ++ 03, 3.3.7 в C ++ 11).std::vector<char>::iterator
- это полное имя в этой области.В случае iterator
он называет тип - не обязательно класс, и даже если это сам класс, он не обязательно определяется в std::vector<char>
, поскольку iterator
может быть typedef.
Как это бывает, область видимости класса не является одной из тех вещей, которые C ++ называет «пространством имен».В повседневном [*] английском вы можете описать его как некое пространство имен, просто это не является правильной терминологией в C ++.
Однако, как бы вы это ни называли, имейте в виду, что это vector<char>
класс и имеет область действия, которая содержит iterator
, а не vector
.std::vector
гарантирует, что любой vector<T>
имеет тип iterator
, но для других шаблонов это не обязательно тот случай, когда каждая специализация имеет одинаковых членов и вложенные типы.Таким образом, vector
охват не существует.
[*] "каждый день", если ваши дни - это дни, когда люди, которые много говорят о пространствах имен.