Возможен ли перенос std :: ofstream? - PullRequest
10 голосов
/ 15 августа 2011

У меня есть эта карта, которая прекрасно компилируется в 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.

Ответы [ 2 ]

8 голосов
/ 15 августа 2011

std::ofstream является подвижным.Эта программа компилируется для меня с использованием clang / libc ++:

#include <string>
#include <fstream>
#include <map>

int main()
{
    std::map<std::string, std::ofstream> m_logFiles;
}

Ссылка 27.9.1.11 [ofstream.cons].

6 голосов
/ 17 августа 2011

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

...