2010-10-09 36 views
3

在msvc中,我有這樣的功能,它構建,但在gcc它不喜歡它。爲什麼msvc讓我這樣做,但不是gcc/g ++?

void classname::a(std::string &text) 
{ 
    stdStringFromClass = text; 
} 

void classname::b(char *text) 
{ 
    a(std::string(text)); 
} 

這裏的問題是在&,GCC我覺得擔心,因爲我剛剛創建的std :: string,即通過引用傳遞是有風險的,所以也沒有建立,但MSVC犯規甚至警告我。

爲什麼這個不正確的C++ gcc我聽說msvc比gcc更嚴格。

感謝

錯誤

AguiWidgetBase.cpp: In member function ‘void AguiWidgetBase::setText(char*)’: 
AguiWidgetBase.cpp:91:27: error: no matching function for call to ‘AguiWidgetBase::setText(std::string)’ 
AguiWidgetBase.cpp:80:6: note: candidates are: void AguiWidgetBase::setText(std::string&) 
AguiWidgetBase.cpp:88:6: note:     void AguiWidgetBase::setText(char*) 

會變成這樣好嗎?

void classname::a(std::string &text) 
{ 
    stdStringFromClass = text; 
} 

void classname::b(char *text) 
{ 
    std::string k = text; 
    a(k); 
} 
+0

需要更多的上下文。什麼是你得到的錯誤,什麼是「stdStringFromClass」等。 – vanza 2010-10-09 20:16:29

+0

stdStringFromClass是一個std :: string – jmasterx 2010-10-09 20:19:40

+0

MSVC不是比gcc更嚴格,這似乎相當倒退給我。錯誤是臨時不能綁定到非const引用。但是,當你顯示很少的代碼時,很難告訴你一個解決方案。你需要修改參數嗎?如果不是,請將其作爲常量參考。有一個'char *'(應該是'const char *')重載以及一個'std :: string'重載是什麼意思? 'std :: string'可以通過'const char *'隱式構造。 – GManNickG 2010-10-09 20:34:28

回答

3

我不知道爲什麼Visual Studio允許你編譯這個,但是你不能傳遞一個匿名對象的引用。

編輯:它適用於const引用,因爲您可以傳遞臨時對象作爲參考,只是能夠修改它沒有任何意義。這就是爲什麼我們在C++ 0x中有右值引用。

編輯2:對於您的編輯,是的,這將解決問題,或者只是在a()方法中採用const引用作爲參數,您似乎不會修改該參數。

+0

哦,你應該看到一些其他的東西msvc讓我做:p – jmasterx 2010-10-09 20:17:12

+0

const引用工作,雖然。我得到的一些猜測錯誤是:「str.cpp:11:錯誤:類型'std :: string&'的非const引用從'std :: string'類型的臨時類型的無效初始化」 – vanza 2010-10-09 20:18:16

6

我認爲這是Visual Studio早在當時支持的舊編譯器擴展,但它保留在現代Visual C++中以保持兼容性。嘗試禁用編譯器擴展(/Za標誌),看看會發生什麼。

或者,使用/W4標誌,以獲得最大的警告,它應該抱怨:

warning C4239: nonstandard extension used

海合會我得到的const引用錯誤:

error: invalid initialization of non-const reference of type ‘std::string&’ from a temporary of type ‘std::string’

0

沒有實際的錯誤信息,我可以只能猜測:class是一個保留關鍵字,您應該以不同的方式命名您的類,這不是有效的方法定義:

void class::a(std::string &text) { ... } 

編輯:問題在於傳遞匿名引用,正如其他人指出的那樣。你現在可以忽略這個答案。

3

我相信別人先說這個,但是傳遞一個匿名對象的引用是非法的。 Visual C++很奇怪。爲了解決這個問題,嘗試這樣的事情:

void class::a(const std::string &text) 
{ 
    stdStringFromClass = text; 
} 

void class::b(const char *text) 
{ 
    a(std::string(text)); 
} 

順便說一句,我認爲你的類名其實不是「階級」,而你只是使用,作爲一個佔位符,因爲

class class { 
    // ... 
}; 

東西是非法的。

相關問題