С++ нет соответствующей функции для list::erase

В настоящее время я пытаюсь просмотреть связанный список типа char. Когда встречается аргумент (если он содержит букву «w»), я пытаюсь удалить элемент списка, используя list::erase. Я просто надеялся получить совет по использованию этой функции, я видел только примеры со связанными списками типа int, и я не могу сказать, не будет ли это работать, потому что это char или по какой причине. Когда я пытаюсь скомпилировать следующий код:

void filterFile(list <char> &myList)
{
    list<char>::const_iterator itr;

    for (itr = myList.begin(); itr != myList.end(); itr++ )
    { 
        if (*itr == 'w' || *itr == 'W'){
            itr = myList.erase (itr);
        }
    }
}

Я получаю ошибку компиляции:

ошибка: нет соответствующей функции для вызова ‘std::__cxx11::list::erase(std::__cxx11::list::const_iterator&)’ itr = myList.erase (itr);

Все, что я сделал до сих пор, было основано на том, что я нашел здесь http://www.cplusplus.com/reference/list/list/erase/.

Я также читал о методе node для удаления элементов в списке. Я просто надеюсь, что этот метод работает, поскольку он кажется лучше, и мне любопытно узнать, что я сделал неправильно.


person Mark Macdonald    schedule 09.05.2016    source источник
comment
Итератор не должен быть константой   -  person Photon    schedule 09.05.2016
comment
@Фотон Неверно. Просмотр подписи для удаления   -  person uh oh somebody needs a pupper    schedule 09.05.2016
comment
Я предлагаю попробовать это с обычным итератором вместо const_iterator. На мой взгляд, const_iterator должен работать, но стоит попробовать, не в этом ли проблема.   -  person Zan Lynx    schedule 09.05.2016
comment
Ваш компилятор поддерживает С++ 11?   -  person songyuanyao    schedule 09.05.2016
comment
Отдельно, когда вы делаете erase, вы все еще нажимаете itr++, что означает, что если вы стерли последний элемент, вы затем выполняете итерацию мимо него, а в других случаях вы пропускаете проверку последовательных W. (cpprference.com — гораздо более надежная ссылка, чем cplusplus.com)   -  person Tony Delroy    schedule 09.05.2016
comment
@songyuanyao: C ++ 11 находится прямо в его сообщении об ошибке, поэтому его компилятор (о котором он должен нам сказать) должен иметь его на каком-то уровне. Однако возможно, что он не предоставил компоновщику параметр C++11, и он не связывает библиотеки C++11.   -  person Zan Lynx    schedule 09.05.2016
comment
Вы не должны делать itr++ после стирания   -  person M.M    schedule 09.05.2016


Ответы (2)


Вы используете С++ 11? std::list::erase поддерживает только const_iterators, начиная с c++11: http://en.cppreference.com/w/cpp/container/list/erase

person Tom Moers    schedule 09.05.2016
comment
Спасибо, Том. Я изменил свой const_interator на iterator, и теперь он будет скомпилирован и запущен. Спасибо за помощь :) Также, пока я здесь, кто-нибудь знает, как изменить значение в указанном элементе. Например. что-то вроде *itr = 'p' (в том же коде, что и выше, заменяя строку стирания). - person Mark Macdonald; 09.05.2016
comment
@mark, это должно работать так, как вы ввели здесь *itr = 'p', при условии, что вы используете обычный iterator, а не const_iterator - person Tom Moers; 09.05.2016
comment
Спасибо, я только что задал вопрос, так как пытался решить это раньше, но не пробовал, так как изменил его с const_iterator. Громадное спасибо за помощь :) - person Mark Macdonald; 09.05.2016

Это ошибка в GCC или, точнее, в libstdc++, которая не было исправлено до 4.9.0

Отсутствующая перегрузка, предусмотренная С++ 11:

iterator erase( const_iterator pos );

приводит к сбою вашего кода.

person uh oh somebody needs a pupper    schedule 09.05.2016