2013-02-18 70 views
0

我创建了一个Url编码器类,其工作是编码或解码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: In member function ‘std::string Url::Url::UrlEncode(std::string)’:
Url.cpp:69:54: error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]
/usr/include/c++/4.6/bits/basic_string.tcc:214:5: error: initializing argument 1 of ‘std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [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; 
} 

回答

1

那么,你的解决方案的错误是,你试图通过一个单一的字符,而不是std::string或c样式0结束字符串(const char *)来映射。

std::string::iterator一次迭代一个字符,因此您可能需要使用std::map< char, std::string >

1

it是一个字符迭代器(它具有类型std::string::iterator)。因此,*it是一个字符。

你正在做reserved[*it],因为你给reservedstd::map<std::string, std::string>)类型的,下标操作者期望一个string,而不是一个char

然后,编译器会尝试一个用户定义的转换从charstd::string,但没有的string构造它接受一个char。有一个虽然接受char const*(请参阅here),但编译器无法将char转换为char const*;因此,错误。

另请注意,您不应使用unsigned作为string::find()返回的值,而应该使用string::size_type

0

它看起来像有*相关它的类型和什么

reservedChars.find() 

应该接受之间的不匹配。

尝试增加

const char* pit = *it; 

unsigned found = this->reservedChars.find(*pit); 

    if(found != string::npos){ 

     encodeUrl.replace(position, 1, this->reserved[*pit]); 
前右