STL Push_back 向量中的字符串
STL Push_back string in vector
我正在尝试将字符串放入字符串向量中,如下所示
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
相同,为什么会出现这样的错误?下面需要更改什么?
您正在通过非常量引用接收 std::string
。非常量引用无法绑定到右值,例如 "10h;"
,因此您不能将文字传递给该函数。
如果你不打算修改参数,你应该通过引用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));
}
这可以防止您制作一些不必要的副本。
您正在传递 "10h;"
,这是一个 const char 数组。
通过传递字符串修复它:Obj.set_val(string("10h"));
并编辑函数以按值获取字符串:
void Node::set_val(string val) { /* */ }
或者更好,编辑您的函数以获取 const string&
:
void Node::set_val(const string &val) { /* */ }
所以在 C++ 中,const char* 可以隐式转换为 std::string,因为 std::string 有一个采用 const char* 的(非显式)构造函数。所以编译器在这里尝试的是为你的函数调用创建一个临时的 std::string 对象,像这样:
Node.set_val(std::string("10h;"));
但是,由于您将 set_val 的参数声明为对 std::string 的非常量引用,编译器无法进行此转换,因为临时对象可以' 绑定到非常量引用。
根据您想要实现的目标,可通过三种方式实现此目的:
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,临时对象不能传递给采用非常量引用的函数。
我正在尝试将字符串放入字符串向量中,如下所示
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
相同,为什么会出现这样的错误?下面需要更改什么?
您正在通过非常量引用接收 std::string
。非常量引用无法绑定到右值,例如 "10h;"
,因此您不能将文字传递给该函数。
如果你不打算修改参数,你应该通过引用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));
}
这可以防止您制作一些不必要的副本。
您正在传递 "10h;"
,这是一个 const char 数组。
通过传递字符串修复它:Obj.set_val(string("10h"));
并编辑函数以按值获取字符串:
void Node::set_val(string val) { /* */ }
或者更好,编辑您的函数以获取 const string&
:
void Node::set_val(const string &val) { /* */ }
所以在 C++ 中,const char* 可以隐式转换为 std::string,因为 std::string 有一个采用 const char* 的(非显式)构造函数。所以编译器在这里尝试的是为你的函数调用创建一个临时的 std::string 对象,像这样:
Node.set_val(std::string("10h;"));
但是,由于您将 set_val 的参数声明为对 std::string 的非常量引用,编译器无法进行此转换,因为临时对象可以' 绑定到非常量引用。
根据您想要实现的目标,可通过三种方式实现此目的:
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,临时对象不能传递给采用非常量引用的函数。