我在使用带有迭代器的字符串函数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。
发布于 2012-03-05 16:33:54
string::find_last_of()不返回迭代器,因此它不能匹配string::erase()的迭代器重载。
幸运的是,接受位置索引的string::erase()重载默认情况下从头到尾都是擦除,因此下面的代码应该适用于您:
strIn.erase(strIn.find_last_of('.'));
strIni.erase(strIni.find_last_of('.'));当然,字符串中最好包含一个'.'字符...
发布于 2012-03-05 16:35:42
错误发生是因为擦除签名需要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 optional。
擦除从位置pos开始的n个字符序列。请注意,这两个参数都是可选的:只有一个参数时,该函数删除从位置pos开始向前的所有内容,没有参数时,该函数删除整个字符串,就像成员clear一样。
strIn.erase(strIn.find_last_of('.'));
strIni.erase(strIni.find_last_of('.'));发布于 2012-03-05 16:36:19
std::find_last_of返回一个size_t,而不是一个迭代器。
https://stackoverflow.com/questions/9563584
复制相似问题