Error de compilación del sistema de archivos de refuerzo
-
20-09-2019 - |
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
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.