2012-03-27 56 views
5

Đây là một câu hỏi đơn giản và phức tạp cùng một lúc.tải fstreams vào một std :: vector trong C++

này biên dịch:

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

này không biên dịch:

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

Có bất kỳ lý do cụ thể không? Có cách nào để tôi có được danh sách năng động của các luồng không?

Các thông báo lỗi:

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 ========== 
+0

Trong C++, điều này sẽ trở thành có thể: IOStream có thể di chuyển và vector sẽ hỗ trợ các loại di chuyển. – MSalters

+0

@MSalters: Một tham chiếu đến một phần của tiêu chuẩn C++ 11 trong đó nêu trên có thể hữu ích ;-) –

+1

@FrankH. : ["Khá nhiều phần 27"] (http://stackoverflow.com/questions/7066691/is-stdofstream-movable), để báo Howard Hinnant. – MSalters

Trả lời

11

Đối tượng fstream không copyable.

Nếu bạn cần ghi lại fstream s trong một vector bạn có thể khai báo số std::vector<std::fstream*> và đẩy lùi địa chỉ của đối tượng. Hãy nhớ rằng nếu bạn lưu con trỏ, thì bạn phải đảm bảo rằng, khi bạn truy cập nó, đối tượng vẫn còn sống.

+2

Một đối tượng không cần phải sao chép để được chuyển vào thùng chứa: đây là hạn chế C++ 2003. Đủ để loại có thể di chuyển được nhưng bạn cần phải sử dụng một đối tượng có thể được di chuyển từ, ví dụ: hoặc là tạm thời hoặc kết quả của 'std :: move()'. –

+0

@ DietmarKühl cần biết. Tôi chắc chắn phải bắt đầu học C++ 11 –

+1

Ngoài ra, 'emplace_back' vào' vector 'hoạt động tốt trong VS2013. (Mặc dù không thành công trong GCC.) –

1

Yêu cầu cơ bản cho loại được đẩy vào vectơ là đối tượng phải được sao chép, fstream không thể sao chép được và do đó bạn gặp lỗi trình biên dịch.

3

Để sử dụng lớp có vectơ, nó phải có thể sao chép được. fstream thì không.

Xem: C++ std::ifstream in constructor problem

Edit: Nếu bạn cần phải có nhiều tài liệu tham khảo cho fstream tương tự, bạn có thể sử dụng shared_ptr để quản lý chúng. Hãy thử một cái gì đó như:

std::vector< std::shared_ptr<fstream> > TEST 
5

Trong C++ 2011 các đối tượng dòng cụ thể có thể di chuyển được. Howver, để tận dụng này bạn có cần phải vượt qua một tạm thời hoặc cho phép các đối tượng được di chuyển:

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

Lưu ý rằng bạn không thể sử dụng biến file sau này như suối đã được chuyển vào files.

Các vấn đề liên quan