簡體   English   中英

向量中的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])'

我假設“”中的string與c ++中的string相同,為什么會出現這樣的錯誤? 下面有什么要改變的?

您通過非const引用接收std::string 非const引用不能綁定到rvalues,例如"10h;" ,所以你不能將文字傳遞給那個函數。

如果你不打算修改參數,你應該通過reference-to-const來獲取你的參數:

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

這樣,臨時的std::string將從你的const char[5]構造並傳遞給set_val

您可以通過按值獲取string並將其movevector來改善這一點:

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

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

所以在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引用的函數。

你正在路過"10h;" 這是一個const char數組。

通過傳遞一個字符串來修復它: Obj.set_val(string("10h")); 並編輯函數以按值獲取字符串:

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

或者更好,編輯你的函數來獲取一個const string&

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM