Aumente o erro de compilação do sistema de arquivos
-
20-09-2019 - |
Pergunta
Estou escrevendo algum código que utiliza a biblioteca de sistemas de arquivos Boost. Aqui está um trecho do meu 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
Eu recebo um erro de compilação:
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 faz parte de um programa que gera um script em lote que usa LAME.EXE para converter arquivos em MP3s. A biblioteca de música que foi projetada para o formato:
raiz/artista/música
OU
raiz/artista/álbum/música
Este-> m_input_path é o caminho para root.
Não tenho certeza se estou abordando o problema corretamente. Se eu estiver, como corrigi o erro que estou recebendo?
EDITAR:
Meu código é agora:
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;
}
O erro que recebo agora é:
Assertion failed: itr.m_pos && "basic_path::iterator decrement pat begin()", file ... boost\filesystem\path.hpp, line 1444
Solução
Basic_Path :: Iterator é um iterador bidirecional. Portanto, a aritmética com -1 e -2 não é permitida. Operadores + e - entre um iterador e um valor inteiro é definido para um RandomAccessIterator.
Em vez de usar .nd ()-1, você pode recorrer ao uso-.
Outras dicas
Seu novo erro indica que seu end_path_iter
não tem elementos suficientes (isso deve ser "decremento passado Comece "?), ou seja, seu caminho é mais curto do que você espera.