У меня проблема при попытке распечатать пары int и строк на карте STL:

Это код, который я использую:

#include <iostream>
#include <utility>
#include <map>

using namespace std;
typedef map<int,string> intID;

int main(){

    intID ID;
    ID.insert(pair<int,string>(123,"studentname1"));
    ID.insert(pair<int,string>(124,"studentname2"));
    ID.insert(pair<int,string>(122,"studentname3"));

    intID::iterator IDIter;
    for(IDIter = ID.begin();IDIter != ID.end();++IDIter){
        cout <<"ID: " << IDIter->first <<", Name: " << IDIter->second << endl;
    }
}

Ошибка возникает в части ", Name: " << IDIter->second, << подчеркивается, говоря, что "ни один оператор не соответствует этим операндам"

Ошибка компиляции:

Ошибка 1 ошибка C2679: двоичный '<<': не найден оператор, который принимает правый операнд типа 'std :: string' (или нет приемлемого преобразования)

Я пытаюсь распечатать второго члена пары (имя студента). Я новичок в сопоставлении STL, поэтому я не уверен, что я делаю не так, что мне нужно изменить?

1
Eduardo 6 Май 2013 в 17:28

1 ответ

Лучший ответ

Вам необходимо включить заголовок <string>. Вы смогли использовать тип std::string только путем случайного включения из других заголовков. На это нельзя полагаться. Включение <string> также приведет к перегрузкам operator<<, которые позволят вам выводить строки.

6
Joseph Mansfield 6 Май 2013 в 17:30
1
Я думаю, вам также следует включить <ostream>, поскольку <iostream> определяет только std::cout, но не его члены. Однако вам часто это сходит с рук, когда реализация услужливо включает <ostream> в <iostream>
 – 
MSalters
6 Май 2013 в 18:44
Перегрузка std::string для operator<< находится не в библиотеке ввода-вывода, а в библиотеке строк.
 – 
Joseph Mansfield
6 Май 2013 в 18:45
1
Правда. Но я написал « также include ostream», поскольку это требуется для последней использованной перегрузки (<< std::endl).
 – 
MSalters
6 Май 2013 в 18:48