tengo este mapa que compila bien en MSVC10:¿El std :: ofstream se puede mover?
std::map<std::string, std::ofstream> m_logFiles;
Pero en Ubuntu usando g ++ 4.5 con activado C++ 0x, me sale el siguiente mensaje de error:
/usr/include/C++/4.5/bits/ios_base.h | 785 | error: 'std :: ios_base :: ios_base (const std :: ios_base :: ios_base (const std :: ios_base &)' es privado
Al usar punteros en lugar de objetos, resolví el problema.
Buscando en la web, aprendí que las transmisiones no están destinadas a ser copiadas (el por qué fue bien explicado). Pero mi pregunta es, ¿std :: ofstream es un tipo movible? Si es así, ¿no debería permitir su uso como parámetro de plantilla en los contenedores estándar?
En caso afirmativo, ¿g ++ está detrás de MSVC10 en este punto? (lo que explicaría por qué funciona en MSVC). Sé que sería una tontería pedirles a los escritores de compiladores que implementen completamente algo que ni siquiera es definitivo, pero tengo curiosidad sobre el futuro.
Usar g ++ 4.6.1 no ayudó.
Editar: leyendo los comentarios Cavé un poco más y descubrí que el inserto está causando el problema, no la declaración del mapa.
enlace de lectura Cubbi He intentado lo siguiente:
#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;
}
Pero sigue sin suerte. g ++ se queja del uso del constructor de copia borrado b.
Compila bien en GCC 4.6.1. –
El código publicado compila bien también en GCC 4.5.3. Sin embargo, la biblioteca de GCC (a diferencia de la libc de clang ++) aún no ha implementado map.emplace() http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44436 - tal vez eso fue lo que causó el mensaje de error? – Cubbi
@Cubbi: Leí su enlace y traté de usar std :: move, pero no cambio. –