2011-08-15 12 views
9

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.

+0

Compila bien en GCC 4.6.1. –

+0

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

+0

@Cubbi: Leí su enlace y traté de usar std :: move, pero no cambio. –

Respuesta

8

std::ofstream es movible. Este programa se compila para mí usando sonido metálico/libC++:

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

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

Referencia 27.9.1.11 [ofstream.cons].

+5

El resultado en cualquier compilador (o incluso muchos compiladores) realmente no responde a esta pregunta. Se necesita una referencia a la especificación. – Nemo

+5

@Nemo - Howard es la persona que implementa la biblioteca estándar para este compilador. Yo confiaría en él. –

+1

Revisa prácticamente toda la sección 27 del borrador de C++ 0x. No encontré un solo lugar que diga "ofstream debe ser movible", pero especifica que las clases de flujo tienen constructores de movimiento y operadores de asignación de movimiento y todas las otras tuberías relacionadas con movimiento. Entonces sí, son móviles, como dijo @Howard. :) – jalf

5

Hice una pregunta similar anteriormente, y más tarde descubrí que GCC aún no parece admitir fstreams móviles (acabo de probar GCC 4.6.1) como se detalla en this answer.

Cuestiones relacionadas