2015-08-30 57 views
-3

我在C新型++,我想不出有什麼不對的代碼如何解決編譯錯誤:類型的std :: __ 1 ::串

string& GetAddonCmeterString(string& sid) { 
    ostringstream oss; 
    oss << "{"; 
    oss <<  "currentValues : {sid : " << sid << "}"; 
    oss << "}"; 
    string& result = oss.str(); 
    return result; 
} 

的」非const引用無效初始化編譯錯誤消息:

錯誤:的類型的非const引用初始化無效 '的std :: __ 1 ::串& {又名的std :: __ 1個:: basic_string的,性病:: __ 1 ::分配器> &}' 從類型'std :: __ 1 :: basic_string,std :: __ 1 :: allocator''的右值 字符串& result = oss.str();

+0

在該行使用'string'而不是'string&' – wimh

+2

這是您最小的擔心。您正在返回對局部變量的引用。 – juanchopanza

+0

另外,你並沒有修改'sid',所以你應該通過const參考。 – juanchopanza

回答

2

是否編譯
不要將指針或引用返回給局部變量!

result將被破壞,當GetAddonCmeterString完成後,您要退回不存在了一個對象的內存地址去分配!

你應該值*返回字符串:

string GetAddonCmeterString(string& sid) { 
    ostringstream oss; 
    oss << "{"; 
    oss <<  "currentValues : {sid : " << sid << "}"; 
    oss << "}"; 
    return oss.str(); 
} 

*的字符串將不通過值返回,但會moved,而是因爲你是新的C++讓我們保持簡單的緣故討論。

+0

所以,如果我重寫這樣的最後一行:return new string(oss.str()); –

+0

然後你將不得不返回字符串作爲指針或引用,並追蹤它,直到你不再需要它。那麼你將不得不調用'delete'。非常讓人頭疼的是你可以通過價值回報的東西。 –

+0

它解決了編譯錯誤嗎? –

相關問題