Форум программистов, компьютерный форум CyberForum.ru

Ошибка при вызове wstring.erase - C++

Восстановить пароль Регистрация
 
elektron5
Заблокирован
12.08.2014, 13:50     Ошибка при вызове wstring.erase #1
форум глючит ...

Добавлено через 1 минуту
Почему erase ругается ?

C++
1
2
3
4
5
6
std::wstring testString = L"SHAKE YOUR TITS (. )^( .)";
for (auto it = testString.rbegin(); it != testString.rend(); it--)
{
    if (*it == L'^')
        testString.erase(it, testString.end()); 
};
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2014, 13:50     Ошибка при вызове wstring.erase
Посмотрите здесь:

C++ Ошибка при вызове деструктора
Ошибка при вызове метода C++
C++ Ошибка при рекурсивном вызове
C++ Ошибка при вызове функции
C++ ошибка при вызове деструктора!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
12.08.2014, 13:54     Ошибка при вызове wstring.erase #2
Цитата Сообщение от elektron5 Посмотреть сообщение
форум глючит
сирень квадрат

Цитата Сообщение от elektron5 Посмотреть сообщение
Почему erase ругается ?
Ошибку приведите пожалуйста.
elektron5
Заблокирован
12.08.2014, 14:09  [ТС]     Ошибка при вызове wstring.erase #3
Цитата Сообщение от SatanaXIII Посмотреть сообщение
сирень квадрат
Писал расширенный вопрос пол часа, потом мне в ответ, что мол нельзя писать в одном слове русский и английские буквы, а таких слов и не было. В общем сообщение после нескольких злостных кликов пропало
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Ошибку приведите пожалуйста.
error C2664: 'std::_String_iterator<std::_String_val<std::_Simple_types<wchar_t>>> std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>::erase(std::_String_const_iterator<std::_String_val<std::_Simple_types<wchar_t>>>,std::_String_const_iterator<std::_String_val<std::_Simple_types<wchar_t>>>)' : cannot convert argument 1 from 'std::reverse_iterator<std::_String_iterator<std::_String_val<std::_Simple_types<wchar_t>>>>' to 'unsigned int'
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Добавлено через 4 минуты
Суть такова. Есть строка. Хочу пробежаться по ней в цикле с конца и найдя определённый символ удалить часть строки, начиная с этого символа до конца строки. Хочу сделать через итераторы, без них всё работает (ну если делать так - for(int i = testString.size() - 1; i != 0; i--). Причём на такой фокус:
C++
1
2
3
4
5
6
std::wstring testString = L"SHAKE YOUR TITS (. )^( .)";
for (auto it = testString.end(); it != testString.begin(); it--)
{
    if (*it == L'^')
        testString.erase(it, testString.end());
};
вообще вылетает экзепшен: string iterator not dereferencable

В первом посте я опечатался, там не it--, а it++, но к делу отношения это не имеет.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
12.08.2014, 14:10     Ошибка при вызове wstring.erase #4
L уберите в четвертой строке.
elektron5
Заблокирован
12.08.2014, 14:20  [ТС]     Ошибка при вызове wstring.erase #5
Цитата Сообщение от SatanaXIII Посмотреть сообщение
L уберите в четвертой строке.
Ну а это - то здесь причём?
Ругается - то на строку testString.erase(it, testString.end());, т.к. он пытается итератор к целому числу позиции привести, тоесть не ту реализацию функции erase хочет использовать почему - то ...

P.S.: да и потом с четвёртой строкой у меня всё в порядке, обычная проверка wide char символа.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
12.08.2014, 14:27     Ошибка при вызове wstring.erase #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Не хочу вмешиваться, но не кажется ли вам, что здесь:
C++
1
2
3
4
5
for (auto it = testString.end(); it != testString.begin(); it--)
{
    if (*it == L'^')
        testString.erase(it, testString.end());
};
На первой иттерации идет обращение за пределами строки?
А первый вариант ругается так как вы передаете в его параметры разные типы итераторов и естесствено компилятор будет пытаться вызвать "не ту" функцию.
Если вам это поможет то правильное решение примерно вот такое:
C++
1
2
3
4
5
    std::wstring testString = L"SHAKE YOUR TITS (. )^( .)";
    for (auto it = testString.rbegin(); it != testString.rend(); ++it) {
        if (*it == L'^')
            testString.erase(it.base() - 1 , testString.end());
    }
Хотя я пожалуй промолчу про методы rfind. Надеюсь вы их сами найдете
elektron5
Заблокирован
12.08.2014, 16:49  [ТС]     Ошибка при вызове wstring.erase #7
Цитата Сообщение от Ilot Посмотреть сообщение
На первой иттерации идет обращение за пределами строки?
всё верно , не заметил, но тогда уж надо делать так (что явно перебор )
C++
1
2
3
4
5
6
7
for (auto it = testString.end() - 1; it >= testString.begin(); it--)
{
    if (*it == L'I')
        testString.erase(it, testString.end());
    if (it == testString.begin())
        break;
};
Цитата Сообщение от Ilot Посмотреть сообщение
А первый вариант ругается так как вы передаете в его параметры разные типы итераторов и естесствено компилятор будет пытаться вызвать "не ту" функцию.
я думал, что итераторы - это простые указатели и разницы никакой, что обратный что нет - т.к. указывают на одну и ту же область памяти, ну да ладно, ошибался значит.
Цитата Сообщение от Ilot Посмотреть сообщение
Если вам это поможет то правильное решение примерно вот такое:
А это что за выкрутас it.base() - 1 ? Что он делает с обратным итератором? Наверное к не обратному приводит, но как ?

Цитата Сообщение от Ilot Посмотреть сообщение
Хотя я пожалуй промолчу про методы rfind
да, хороший способ, как то я и не подумал

Добавлено через 1 час 57 минут
Цитата Сообщение от Ilot Посмотреть сообщение
testString.erase(it.base() - 1
Объясните хоть что значит эта строка. По описанию функции base() не могу понять что она делает вообще и зачем нужна ...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2014, 17:16     Ошибка при вызове wstring.erase
Еще ссылки по теме:

C++ Error C3867 при вызове функции erase и insert для двумерного вектора
Ошибка при вызове деструктора C++
C++ Ошибка при вызове деструктора

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.08.2014, 17:16     Ошибка при вызове wstring.erase #8
elektron5, Возвращает прямой итератор, от которого был построен данный обратный. http://en.cppreference.com/w/cpp/ite..._iterator/base
Yandex
Объявления
12.08.2014, 17:16     Ошибка при вызове wstring.erase
Ответ Создать тему
Опции темы

Текущее время: 14:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru