У меня есть эта карта, которая прекрасно компилируется в 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 ++ жалуется на использование конструктора удаленных копий b.