任何人都可以告诉我为什么这段代码生成“没有匹配的呼叫功能”错误?我相信语法是正确的,我真的不知道为什么它不起作用。我想将Template_中出现的{{some_key}}替换为传递给函数的unordered_map中some_key的匹配值。
std::string View::Render(const std::unordered_map<std::string, std::string> &model) const {
for(int i = 0; i < this->Template_.length(); ++i){
if(this->Template_[i] == '{' && this->Template_[i+1] == '{'){
int PositionBegin = i;
std::string Key = FindKey();
if(Key.length() > 0) {
std::unordered_map<std::string, std::string>::const_iterator Found = model.find(Key);
if (Found != model.end())
this->Template_.replace(PositionBegin, Key.length()+4, Found->second);
}
}
}
return this->Template_;
}
View类看起来很简单:
class View {
public:
View(const std::string &Template);
std::string Render(const std::unordered_map<std::string, std::string> &model) const;
std::string Template_;
};
完整错误是:
error: no matching function for call to ‘std::__cxx11::basic_string<char>::replace(int&, std::__cxx11::basic_string<char>::size_type, const std::__cxx11::basic_string<char>&) const’ this->Template_.replace(PositionBegin, Key.length()+4, Found->second);
答案 0 :(得分:4)
您的功能定义为
std::string View::Render(const std::unordered_map<std::string, std::string> &model) const
因为const
表示您无法修改任何类成员。 replace
会修改Template_
,因此您无法调用它。
您有两种方法可以解决此问题。如果您希望能够操纵const
,或者您可以将Template
声明为Template_
,则可以删除该功能上的mutable
,以便对其进行修改。
答案 1 :(得分:2)
问题是由于尝试修改const
对象的成员变量引起的。
成员函数是const
成员函数。因此,this->Template_
也是const
个对象。您正尝试使用
this->Template_
this->Template_.replace(PositionBegin, Key.length()+4, Found->second);
如果您的程序逻辑要求您修改this->Template_
成员函数中的const
,则必须使用mutable
对其进行限定。