этот ответ
я есть эта карта, которая прекрасно компилируется в MSVC10:
std::map<std::string, std::ofstream> m_logFiles;
Но в Ubuntu, использующем g ++ 4.5 с включенным C ++ 0x, я получаю следующее сообщение об ошибке:
/usr/include/c++/4.5/bits/ios_base.h|785|error: ‘std :: ios_base :: ios_base (const std :: ios_base &) 'является приватным
Используя указатели вместо объектов, я решил проблему.
Выполняя поиск в Интернете, я узнал, что потоки не предназначены для копирования (причина была хорошо объяснена). Но мой вопрос, является ли std :: ofstream подвижным типом? Если это так, разве не должно быть разрешено его использование в качестве параметра шаблона в стандартных контейнерах?
Если да, то стоит ли G ++ от MSVC10 по этому вопросу? (что объясняет, почему это работает на MSVC). Я знаю, что было бы глупо просить авторов компиляторов полностью реализовать что-то, что даже не является окончательным, но мне любопытно относительно будущего.
Использование g ++ 4.6.1 не помогло.
Редактировать: читая комментарии, я вырыл немного дальше и обнаружил, что проблема связана с вставкой, а не с объявлением карты.
Читая ссылку Кубби, я попробовал следующее:
#include <string>
#include <fstream>
#include <map>
using namespace std;
int main()
{
map<string, ofstream> m_logFiles;
ofstream st;
m_logFiles.insert(make_pair<string, ofstream>(string("a"), move(st)));
return 0;
}
Но все равно не повезло. G ++ жалуется на использование конструктора удаленных копий.