Tôi có bản đồ này mà biên dịch tốt trong MSVC10:Có phải std :: ofstream movable?
std::map<std::string, std::ofstream> m_logFiles;
Nhưng trên ubuntu sử dụng g ++ 4.5 với C++ 0x kích hoạt, tôi nhận được thông báo lỗi sau:
/usr/include/C++/4.5/bit/ios_base.h | 785 | lỗi: 'std :: ios_base :: ios_base (const std :: ios_base &)' là riêng tư
Bằng cách sử dụng con trỏ thay vì đối tượng, tôi giải quyết được sự cố.
Tìm kiếm trên web, tôi đã học được rằng các luồng không có nghĩa là được sao chép (lý do tại sao đã được giải thích rõ ràng). Nhưng câu hỏi của tôi là, là std :: ofstream một loại di chuyển? Nếu có, nó có nên cho phép sử dụng nó như một tham số mẫu trong các thùng chứa tiêu chuẩn không?
Nếu có, sau đó là g ++ phía sau MSVC10 vào thời điểm này? (mà sẽ giải thích tại sao nó hoạt động trên MSVC). Tôi biết nó sẽ là ngớ ngẩn khi yêu cầu các nhà biên dịch biên dịch thực hiện đầy đủ điều gì đó thậm chí không phải là cuối cùng, nhưng tôi tò mò về tương lai.
Sử dụng g ++ 4.6.1 không hữu ích.
Chỉnh sửa: đọc nhận xét tôi đã đào sâu thêm một chút và nhận thấy rằng chèn đang gây ra sự cố, chứ không phải việc khai báo bản đồ.
link Reading Cubbi của tôi thử như sau:
#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;
}
Nhưng vẫn không có may mắn. g ++ than phiền về việc sử dụng b constructor đã bị xóa.
Biên dịch tốt trong GCC 4.6.1. –
Mã đăng cũng biên dịch tốt trong GCC 4.5.3. Tuy nhiên, thư viện của GCC (không giống như libC++ của clang) vẫn chưa triển khai map.emplace() http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44436 - có lẽ đó là nguyên nhân gây ra thông báo lỗi? – Cubbi
@Cubbi: Tôi đã đọc liên kết của bạn và thử sử dụng std :: move, nhưng không thay đổi. –