我创建了一个Url Encoder类,其作用是对Url进行编码或解码。
为了存储特殊字符,我使用地图std::map<std::string, std::string> reserved
。
我已经像这样this->reserved["!"] = ":)";
对于从给定字符串中读取字符,我使用的是迭代器for(string::iterator it=input.begin(); it!=input.end(); ++it)
现在,当我尝试使用替换函数encodeUrl.replace(position, 1, this->reserved[*it]);
我收到以下错误
Url.cpp:在成员函数'std :: string Url :: Url :: UrlEncode(std :: string)'中: Url.cpp:69:54:错误:从'char'无效转换为'const char *'[-fpermissive]
/usr/include/c++/4.6/bits/basic_string.tcc:214:5:错误:初始化'std :: basic_string&lt; _CharT,_Traits,_Alloc&gt; :: basic_string(const _CharT *,const _Alloc&amp;)的参数1 [ with _CharT = char,_ Traits = std :: char_traits,_Alloc = std :: allocator]'[-fpermissive]
我不确定代码有什么问题。这是我的功能
string Url::UrlEncode(string input){
short position = 0;
string encodeUrl = input;
for(string::iterator it=input.begin(); it!=input.end(); ++it){
unsigned found = this->reservedChars.find(*it);
if(found != string::npos){
encodeUrl.replace(position, 1, this->reserved[*it]);
}
position++;
}
return encodeUrl;
}
答案 0 :(得分:1)
it
是字符的迭代器(类型为std::string::iterator
)。因此,*it
是一个角色。
您正在执行reserved[*it]
,并且由于您为reserved
(std::map<std::string, std::string>
)提供的类型,下标运算符需要string
,而不是char
}。
编译器然后尝试从char
到std::string
的用户定义转换,但没有string
的构造函数接受char
。但是有一个接受char const*
(请参阅here),但编译器无法将char
转换为char const*
;因此,错误。
另请注意,您不应将unsigned
用于string::find()
返回的值,而应使用string::size_type
。
答案 1 :(得分:1)
嗯,您的解决方案中的错误是您尝试传递单个字符而不是std::string
或c样式0终止字符串(const char *
)来映射。
std::string::iterator
一次迭代一个字符,因此您可能希望使用std::map< char, std::string >
。
答案 2 :(得分:0)
看起来*它的类型和什么
之间存在不匹配 reservedChars.find()
应该接受。
尝试添加
const char* pit = *it;
之前
unsigned found = this->reservedChars.find(*pit);
if(found != string::npos){
encodeUrl.replace(position, 1, this->reserved[*pit]);