2011-12-18 19 views
5

Estoy tratando de iterar sobre un directorio usando la biblioteca Boost.Filesystem.boost filesystem :: path constructor std :: length_error

El problema es que cuando intento crear una instancia de un objeto de ruta, obtengo un std :: length_error con el mensaje "string too long" con cadenas de cualquier longitud, incluso por ejemplo "pippo".

Ya he probado todos ellos:

string s = "pippo"; 

path p(s); 
path p(s.begin(), s.end()); 
path p(s.c_str()); 
path p("pippo"); 

estoy en Windows 7 con impulso precompiled versión 1.47 para VC++ 10.

gracias de antemano, Luca

EDITAR

esto se ejecuta el código de impulso (línea path.hpp 129)

template <class Source> 
path(Source const& source, 
    typename boost::enable_if<path_traits::is_pathable< 
    typename boost::decay<Source>::type> >::type* =0) 
{ 
    path_traits::dispatch(source, m_pathname, codecvt()); 
} 

y el error es lanzado desde (path_traits .hpp línea 174)

template <class U> inline 
void dispatch(const std::string& c, U& to, const codecvt_type& cvt) 
{ 
    if (c.size()) 
    convert(&*c.begin(), &*c.begin() + c.size(), to, cvt); 
} 

la función que arroja es "convertir". Desde el depurador vi que tanto

&*c.begin() 

y

&*c.begin() + c.size() 

se ejecutan correctamente

+0

¿Es este el código exacto que está ejecutando? – CharlesB

+1

Intenta ejecutar en un depurador y dinos exactamente de dónde viene el error (archivo/línea). –

+0

Sí, este es el código exacto. Actualicé la publicación con la línea que arroja. Gracias por su ayuda –

Respuesta

1

Usted ha mencionado que Boost está pre-compilado para VC++ 10, pero no dijo qué compilador que USTED está usando. Si está utilizando Visual C++ Express, debe compilarlo usted mismo.

Pero, como estoy a punto de utilizar boost :: filesystem, pensé que investigaría un poco para aprender un poco.

En primer lugar, casi nunca deberías poner todo un espacio de nombres de Boost en tu espacio de nombres simple siempre que sea posible (¡especialmente si lo haces con std!). Publicar código como este hace que parezca que está "usando el espacio de nombres" demasiado. Si no desea escribir impulso :: sistema de archivos en todas partes, hacer esto:

namespace fs = boost::filesystem; 
fs::path p(whatever); 

o

using boost::filesystem::path; 
using std::string; 
string foo("Hello!"); 
path p(foo); 

La inclusión de espacios de nombres impulso en su espacio de nombres local, como usted parece puede tener consecuencias desastrosas (o el trabajo bien, es la suerte del sorteo). Como habrás notado, la llamada a la función que lo mata es convert() - ¿hay quizás otra convert() en alguna parte que la esté reemplazando?

A continuación, debe habilitar el enlace automático (para esta biblioteca). La documentación oficial de Boost dice que se debe usar el enlace automático. La gente de Boost es muy inteligente (tal vez demasiado inteligente, trabajar con las bibliotecas de tiempo es un problema ...) Funciona bien para Visual Studio 2010.

Si eso no lo soluciona, su Boost precompilado está usando una versión diferente CRT (ya que la función de conversión parece estar en la biblioteca de Boost). Esto puede suceder por muchas razones, por ejemplo, el service pack VS2k10 puede instalarse en su fuente/no en la suya, etc.

La solución definitiva es compilar Boost usted mismo. Es muy, muy fácil en Windows: descargue las fuentes de Boost y extraiga a cualquier directorio. A continuación, abra un símbolo del sistema (Inicio> Ejecutar cmd.exe) y hacer:

cd\ 
cd "boost root directory" 
boostrap 
.\b2 

Entonces sólo tiene que esperar unos 45 minutos en un Duo de 2,5 GHz Core 2. Generará las bibliotecas de Boost con el CRT correcto. Si todavía tiene problemas, entonces hay un problema más grave con su sistema de compilación, como vincularlo con una biblioteca estática de Boost mientras usa DLL CRT (debe vincular DLL Boost con DLL CRT).

+0

Compilé manualmente y usé autolinking. Ahora funciona, gracias. Por cierto, las líneas de código en mi primera publicación son solo para ejemplificar; obviamente estoy usando el espacio de nombres de impulso como sugirió. –

+0

@Picci lo siento, sigo dando lecciones de estilo a todos, jaja. Supongo que fue algo relevante aquí. Me alegra que lo hayas hecho funcionar. Estoy implementando en múltiples plataformas y arquitecturas, así que es realmente útil para mí saber que fue un problema de CRT. Ahora sé dónde buscar errores similares si no mantengo mis binarios actualizados en, digamos, versiones principales de GCC. –

1

Se puede encontrar un posible error en la biblioteca que ha vinculado en el proyecto (versión en lugar de una de depuración). Por ejemplo.

Supongamos que está utilizando Visual Studio 2010 con la configuración "Debug" activa. Hay que vincular boost_filesystem-VC100-mt-gd-1_49.dll

boost_filesystem: nombre base de la biblioteca

VC100: versión de Visual Studio (VC100 para VS2010)

mt : multithreading

gd: depuración versión

1_49: Versión

Tal vez usted ha vinculado la biblioteca sin la "gd".

Cuestiones relacionadas