string :: erase не принимает итераторы? - PullRequest
1 голос
/ 05 марта 2012

У меня проблема с использованием строковой функции erase с итераторами.

Приведенная ниже функция берет имена входных файлов и .ini файлов и создает путь для выходного файла.Путь определяется как

dir + in_file + def_name + ini_file + ".txt"

Я использую erase для удаления расширений имен входных файлов.

void Output::vDefault(string in, string ini)
{
 //save names
 strIn=in;
 strIni=ini;

 //get working dir
 char mydirectory[MAX_PATH] = {""};
 GetCurrentDirectory(MAX_PATH,mydirectory);

 //erase extensions
 strIn.erase(strIn.find_last_of('.'), strIn.end()); // error
 strIni.erase(strIni.find_last_of('.'), strIni.end()); // error

 //adr starts with folder
 strAdr=mydirectory;
 //and ends with name
 //address=dir+in_file+def_name+ini_file+.txt;
 strAdr+=strIn+DEFOUTNAME+strIni+".txt";    
}

Запуск кода вызывает ошибку ниже:

error C2664: 'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::erase(unsigned int,unsigned int)' : cannot convert parameter 2 from 'std::_String_iterator<_Elem,_Traits,_Alloc>' to 'unsigned int'

erase может принимать два итератора как первый и последний.Вы можете мне помочь?Я не знаю, почему он не принимает ничего, кроме int в моем проекте.

Ответы [ 3 ]

1 голос
/ 05 марта 2012

Ошибка возникает из-за того, что сигнатура удаления занимает 2 итератора size_t или 2. Не комбинация. find_last_of возвращает size_t

http://www.cplusplus.com/reference/string/string/erase/

string& erase ( size_t pos = 0, size_t n = npos );
iterator erase ( iterator position );
iterator erase ( iterator first, iterator last );

http://www.cplusplus.com/reference/string/string/find_last_of/

size_t find_last_of ( const string& str, size_t pos = npos ) const;
size_t find_last_of ( const char* s, size_t pos, size_t n ) const;
size_t find_last_of ( const char* s, size_t pos = npos ) const;
size_t find_last_of ( char c, size_t pos = npos ) const;

Решение заключается в использовании

string& erase ( size_t pos = 0, size_t n = npos );

Здесь size_t n необязательно.

Стирает последовательность из n символов, начиная с позиции поз. уведомление что оба параметра являются необязательными: с одним аргументом функция удаляет все с позиции pos вперед и без аргументы, функция удаляет всю строку, как член clear.

strIn.erase(strIn.find_last_of('.'));
strIni.erase(strIni.find_last_of('.'));
0 голосов
/ 05 марта 2012

std :: find_last_of возвращает size_t, а не итератор.

0 голосов
/ 05 марта 2012

string::find_last_of() не возвращает итератор, поэтому он не может соответствовать перегрузке итератора string::erase().

К счастью, перегрузка string::erase(), которая принимает индекс для позиции, по умолчанию стирается оттуда до конца, поэтому для вас должно работать следующее:

strIn.erase(strIn.find_last_of('.'));
strIni.erase(strIni.find_last_of('.'));

Конечно, строка лучше иметь символ '.' ...

...