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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top