2010-08-04 88 views
0

參考參數看一看在下面的代碼段構造與以g ++編譯器

頭文件:

class CxUser 
{ 
public: 
    CxUser(string& guid) {} 
}; 

我有一個C++文件,使用CxUser(string("xxx-xxx-x-xxxx"))實例化的類。但是這個語句無法在g ++中編譯,錯誤「沒有匹配函數調用CxUser :: CxUser(std :: string)」,而它使用VC++編譯。令人驚訝的是,下面這段代碼來實例化類的作品。

string guid("xxx-x-xxxx-xxx-xx"); CxUser user(guid); 

任何幫助,將不勝感激....

+0

你能發佈錯誤信息嗎? – doron 2010-08-04 13:37:00

+0

用錯誤消息編輯 – Prabhu 2010-08-04 13:38:42

回答

12

您需要:

class CxUser{ public: CxUser(const string& guid) {} } 

當你說:

CxUser c("foobar"); // or whatever 

一個臨時字符串對象從characterv創建陣列。在C++中,您不能將非const引用綁定到臨時對象。

2

您正在要求傳遞一個字符串的引用 - 實質上是一個指向它存儲位置的指針。但是當你像這樣創建匿名臨時文件時,它不會存儲在任何地方---「那裏沒有」 - 沒有任何可以傳遞的東西。通過將其存儲在指定的臨時文件中,您可以爲其提供一個位置。

當您使用非const引用作爲參數時,意味着您將更改不存在的引用,因此您無法更改它。當你使用const引用時,編譯器知道你不能改變它,所以它可以做一些魔術,這樣匿名臨時引用參數就可以工作。

+0

如果是這樣的話,你不能在一個臨時的(它接收到一個非const的this指針)上調用非const成員,但你可以。 – 2010-08-04 13:46:31

+0

@本:不合法,不。 – 2010-08-04 13:51:18

+0

@Konrad:你是說你不能合法地在非臨時性的會員上打電話嗎? – 2010-08-04 14:23:21

1

我認爲如果你讓構造函數接受const std::string&那麼CxUser(string("xxx-xxx-x-xxxx"))應該工作。

+1

你的意思是'const std :: string&'(當然它的工作原理沒有參考) – UncleZeiv 2010-08-04 13:48:07

+0

嗯。無論何時你傳遞一個非POD值,你都應該通過引用或指針傳遞它。 – 2010-08-04 13:59:33