Pregunta

Estoy escribiendo algún código que utilice la biblioteca del sistema de archivos Boost. Aquí hay un extracto de mi código:

artist = (this->find_diff(paths_iterator->parent_path(), this->m_input_path) == 1) ? (*(paths_iterator->parent_path().end() - 1)) : (*(paths_iterator->parent_path().end() - 2));
album = (this->find_diff(paths_iterator->parent_path(), this->m_input_path) == 1) ? "" : (*(paths_iterator->parent_path().end() - 1));

Tipos:

artist and album are of type std::string
this->find_diff returns an int
this->m_input_path is a std::string
paths_iterator is of type std::vector(open bracket)boost::filesystem::path>::iterator

Recibo un error de compilación:

error C2039: 'advance' : is not a member of 'boost::filesystem::basic_path<String,Traits>::iterator'    d:\development\libraries\boost\boost\iterator\iterator_facade.hpp on line 546

Este código es parte de un programa que genera un script por lotes que usa Lame.exe para convertir archivos en MP3. La biblioteca de música para la que está diseñada tiene el formato:

raíz/artista/canción

O

raíz/artista/álbum/canción

this-> m_input_path es la ruta a la raíz.

No estoy seguro de si me estoy acercando al problema correctamente. Si lo soy, ¿cómo soluciono el error que estoy recibiendo?

EDITAR:

Mi código es ahora:

    boost::filesystem::path::iterator end_path_itr = paths_iterator->parent_path().end();
    if(this->find_diff(paths_iterator->parent_path(), this->m_input_path) == 1) /* For cases where: /root/artist/song */
    {
        album = "";
        end_path_itr--;
        artist = *end_path_itr;
    }
    else /* For cases where: /root/artist/album/song */
    {
        end_path_itr--;
        album = *end_path_itr;
        end_path_itr--; <-- Crash Here
        artist = *end_path_itr;
    }

El error que ahora recibo es:

Assertion failed: itr.m_pos && "basic_path::iterator decrement pat begin()", file ... boost\filesystem\path.hpp, line 1444
¿Fue útil?

Solución

Basic_path :: Iterator es un iterador bidireccional. Entonces no se permite la aritmética con -1 y -2. Operadores + y - entre un iterador y un valor entero se define para un accesorios aleatorios.

En lugar de usar .end ()-1, puede recurrir a usar-.

Otros consejos

Su nuevo error indica que su end_path_iter no tiene suficientes elementos (si eso es "disminución pasado Comienza "?), es decir, tu camino es más corto de lo que esperas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top