向量中的STL Push_back字符串

时间:2015-06-12 09:51:48

标签: c++ vector stl

我正在尝试在字符串向量中推送一个字符串,如下面的

void Node::set_val(string &val)
{
    this->val.push_back(val);
}

但是当我尝试将其称为

Obj.set_val("10h;");

我收到以下错误,

error: no matching function for call to 'Node::set_val(const char [5])'

我认为"中的字符串"与c ++中的string相同,为什么会出现这样的错误?下面需要改变什么?

3 个答案:

答案 0 :(得分:9)

您通过非const引用接收std::string。非const引用不能绑定到rvalues,如"10h;",因此您无法将文字传递给该函数。

如果你不打算修改参数,你应该通过reference-to-const来获取你的参数:

void Node::set_val(const string &val)
//                 ^^^^^

这样,您的std::string就会构建一个临时的const char[5]并传递给set_val

您可以通过按string按值并move将其加入vector来改善这一点:

void Node::set_val(string val)
{
    this->val.push_back(std::move(val));
}

这可以防止您制作一些不必要的副本。

答案 1 :(得分:2)

所以在C ++中,const char *可以隐式转换为std :: string,因为std :: string有一个带有const char *的(非显式)构造函数。所以编译器在这里尝试的是为函数调用创建一个临时的std :: string对象,如下所示:

Node.set_val(std::string("10h;"));

但是,由于您将set_val的参数声明为对std :: string的非const引用,因此编译器无法使此转换工作,因为临时对象无法绑定到非const引用。

根据您想要实现的目标,有三种方法可以完成这项工作:

void Node::set_val(const std::string& val) {}
void Node::set_val(std::string val) {}
void Node::set_val(std::string&& val) {}

所有将编译(最后一个需要C ++ 11或更高版本),但看到你的用例,我建议使用第二个或第三个。为了解释原因,请尝试阅读一下C ++ 11中的移动语义。

这里要带走的重要一点是const char *通过创建临时对象隐式转换为std :: string,并且临时对象不能传递给采用非const引用的函数。

答案 2 :(得分:0)

您正在传递"10h;"这是一个const char数组。

通过传递字符串Obj.set_val(string("10h"));并编辑函数以按值获取字符串来修复它:

void Node::set_val(string val) { /* */ }

或者更好,编辑您的函数以获取const string&

void Node::set_val(const string &val) { /* */ }