2012-03-05 70 views
1

我有一个问题,使用字符串函数erase与迭代器。string :: 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

+1

另外:你不需要“保存名字”,你可以通过值*传递字符串*。 – Johnsyweb 2012-03-05 08:39:59

回答

0

string::find_last_of()不返回迭代器,所以它不能匹配string::erase()的迭代器超载。

幸运的是,string::erase()重载需要的位置默认的索引来擦除从有到年底,所以下面应该为你工作:

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

当然,串最好实际上有一个'.'中的字符...

+0

我检查'。'之前。我将使用strIn.erase(strIn.find_last_of('。')); thx – Eskalante 2012-03-05 09:25:53

+0

如果没有找到字符串,则会返回'string :: npos',这是'end()'的等价物,所以这不成问题。 – Xeo 2012-03-07 15:26:29

1

发生错误是因为擦除签名需要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可选用。

擦除从位置pos开始的n个字符序列。注意 这两个参数都是可选的:只有一个参数, 函数删除位置pos前向的所有内容,并且没有参数 ,该函数将删除整个字符串,如成员清除。

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

它工作,如果我这样使用它:size_t tmp = strIni.find_last_of('。'); \t strIni。擦除(tmp,string :: npos); thx – Eskalante 2012-03-05 09:14:11

+0

你可以省略'string :: npos',只是'strIn.erase(strIn.find_last_of('。'));' – RvdK 2012-03-05 09:33:51