C ++ string.replace生成“没有匹配的调用函数”错误

时间:2018-04-03 15:44:33

标签: c++ string class object

任何人都可以告诉我为什么这段代码生成“没有匹配的呼叫功能”错误?我相信语法是正确的,我真的不知道为什么它不起作用。我想将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);

2 个答案:

答案 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对其进行限定。