Проблема в том, что вы определяете map
как переменную внутри main
.Само определение вроде в порядке, так как, когда тип анализируется, переменная еще не была объявлена, и map
в map<string, int>
ищется с общими правилами поиска, сначала внутри функции,затем во вложенном пространстве имен, а затем в используемом пространстве имен (std
) из-за строки using namespace std;
.
После того, как переменная определена в первой строке в main, идентификатор map
относится клокальная переменная.По сути, компилятор видит map
в map<string,int>::iterator
и ищет его.Он находит локальное имя map
, которое ссылается на переменную, и останавливает поиск там.Затем он видит следующий токен препроцессора <
и анализирует его как оператор меньше чем , затем находит string
и выводит сообщение об ошибке.
Вы всегда должны оставаться вИмейте в виду, что поиск в C ++ для неквалифицированных имен начинается во внутреннем контексте и выползает оттуда, но останавливается при первом появлении идентификатора, который вы используете.Вы можете решить это, явно указав идентификаторы, и это также решит проблему.Обратите внимание, что using namespace
, вероятно, не очень хорошая подсказка для кого-то, начинающего с языка.
using namespace std; // <- best remove this algothether
int main() {
map<string, int> map;
std::map<string, int>::iterator it = map.begin(); // [1]
}
В этой измененной версии, добавив квалификацию std::
перед map
, вы намекаете компилятору, что вынам не нужна переменная map
в текущем контексте, а идентификатор map
из пространства имен std
.Было бы лучше, если бы вы вообще удалили using
:
int main() {
std::map<std::string, int> map;
std::map<std::string, int>::iterator it = map.begin();
}
, и выбор более разумных имен для переменных может помочь избежать подобных проблем.