загрузка потоков в std :: vector в c ++ - PullRequest
5 голосов
/ 27 марта 2012

Это простой и сложный вопрос одновременно.

Компилируется:

int Test;
vector<int> TEST;
TEST.push_back(Test);
cout << TEST.size();

Не компилируется:

fstream Test;
vector<fstream> TEST;
TEST.push_back(Test);
cout << TEST.size();

Есть ликонкретная причина?Есть ли способ для меня получить динамический список потоков?

Сообщение об ошибке:

1>------ Build started: Project: vector_test, Configuration: Debug Win32 ------
1>  vector_test.cpp
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\fstream(1347): error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\ios(176) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          This diagnostic occurred in the compiler generated function 'std::basic_fstream<_Elem,_Traits>::basic_fstream(const std::basic_fstream<_Elem,_Traits> &)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Ответы [ 4 ]

11 голосов
/ 27 марта 2012

Объект fstream не копируется.

Если вам нужно записать fstream s в vector, вы можете объявить std::vector<std::fstream*> и вернуть адрес объекта. Помните, что если вы сохраните указатель, то при обращении к нему вы должны убедиться, что объект все еще жив.

5 голосов
/ 27 марта 2012

В C ++ 2011 объекты бетонных потоков являются подвижными. Однако, чтобы воспользоваться этим, вам нужно либо передать временный объект, либо разрешить перемещение объекта:

std::vector<std::ofstream> files;
files.push_back(std::ofstream("f1"));
std::ofstream file("f2");
files.push_back(std::move(file));

Обратите внимание, что после этого нельзя использовать переменную file, поскольку поток был перемещен в files.

3 голосов
/ 27 марта 2012

Чтобы использовать класс с вектором, он должен быть копируемым. fstream нет.

См .: C ++ std :: ifstream в задаче конструктора

Редактировать: Если вам нужно иметь несколько ссылок на один и тот же поток, вы можете использовать shared_ptr для управления ими. Попробуйте что-то вроде:

std::vector< std::shared_ptr<fstream> > TEST
1 голос
/ 27 марта 2012

Основным требованием для типа, который нужно вставить в вектор, является то, что объект должен быть копируемым, fstream не копируемым, и, следовательно, вы получаете ошибки компилятора.

...