我的函數聲明爲
siteObject(std::string& url, std::string& get, std::string& post);
爲什麼它試圖發送一個char數組而不是一個字符串?
所以爲什麼這site("String 1", "String 2", "String 3")
;創建一個不匹配類型的錯誤。它說它需要一個字符串引用,並且它正在接收一個char數組。如果您需要更多的細節,請在評論中提問。
我的函數聲明爲
siteObject(std::string& url, std::string& get, std::string& post);
爲什麼它試圖發送一個char數組而不是一個字符串?
所以爲什麼這site("String 1", "String 2", "String 3")
;創建一個不匹配類型的錯誤。它說它需要一個字符串引用,並且它正在接收一個char數組。如果您需要更多的細節,請在評論中提問。
正確的調用是:
std::string url("...");
std::string get("...");
std::string post("...");
siteObject(url, get, post);
這是有道理的,因爲該方法的簽名意味着你得到的東西早在三根弦(非const引用),你可以使用這些返回值。
如果不是意圖,你必須改變siteObject()方法的能力,那麼你應該做的:
siteObject(std::string const & url, std::string const & get, std::string const & post);
,並使用你原來的電話。
你siteObject
功能:
siteObject(std::string& url, std::string& get, std::string& post);
需要字符串對象,其可以不被綁定到右值(或臨時變量)非const引用。
當您嘗試使用字符串文字調用該函數時,編譯器必須將這些參數(即char*
)轉換爲與參數類型相匹配的內容 - 該轉換會生成一個臨時的std::string
對象。
你需要改變你的函數接受常量引用,如果你希望能夠將它們綁定到臨時對象:
siteObject(std::string const& url, std::string const& get, std::string const& post);
或者你可以改爲通過參考值:
siteObject(std::string url, std::string get, std::string post);
你需要讓你的函數接受const std::string& str
或者構造字符串實例來傳入,而不是依賴char *到字符串對象的隱式轉換。
用雙引號字符輸入的字符串來自C++的C遺產(它們被稱爲C字符串或NUL終止字符串)。它們由編譯器實現爲char
的數組。相反,std::string
是一個C++類,旨在簡化字符串的操作。它擁有一個C字符串(並且可以從一個C字符串創建,因爲它具有接受const char*
的構造函數),並管理其內存。
由於存在一個來自const char*
的std::string
的構造函數,並且C字符串與該類型兼容,編譯器如何不能調用此函數?這是因爲該函數對std::string
對象採取非const引用。在這種情況下不能使用構造函數,因爲創建的對象將是臨時對象,並且您無法獲得對臨時對象的非常量引用,因爲被調用的函數可能會對其進行變異。
您可以創建std::string
,並將它們傳遞給函數:
std::string s1("String 1");
std::string s2("String 2");
std::string s3("String 3");
site(s1, s2, s3);
或者你也可以改變site
函數的原型接受const引用。這是唯一可能的,如果功能不改變的對象,你有權訪問的代碼:
// Declaration
void site(const std::string& s1, const std::string& s2, const std::string s3);
// Usage
site("String 1", "String 2", "String 3");
長話短說:C設計師作出字符串literaks類型'char []`; C++設計人員使C++與C兼容,併爲包括你在內的所有C++程序員提供了一大堆煩惱,包括這一個。 – delnan 2011-01-19 20:29:00