2015-10-18 52 views
0

我不明白爲什麼std::string在將它傳遞給構造函數時轉換爲QString。下面是小例子:在構造函數中將std :: string轉換爲QString

class StringHandler 
{ 
private: 
    QString str; 
public: 
    StringHandler(QString s): str(s) {} 
    }; 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    std::string str = "string"; 
    QString qstr(str); // it gives error there are no constructor QString(std::string) 
    StringHandler handler(QString(str));//it does not give an error. Why? 

    return a.exec(); 
} 

編輯:

class StringHandler 
{ 
public: 
    StringHandler(QString s): str(s) {} 
    QString str; 
}; 

int main(int argc, char *argv[]) 
{ 
QCoreApplication a(argc, argv); 

std::string str = "string"; 
StringHandler handler(QString(str));//Here should be error, but there no error. Why? 
qDebug()<<handler.str; //Error is here: request for member 'str' in 'handler', which is of non-class type 'StringHandler(QString)' 

return a.exec(); 
} 
+1

請添加實際的錯誤輸出。 –

+0

可能重複[如何將字符串轉換爲QString?](http://stackoverflow.com/questions/1814189/how-to-change-string-into-qstring) – emlai

+0

@zenith問題不是關於錯誤。我不明白爲什麼這行:'StringHandler處理程序(QString(str))'工作。 – Leo

回答

3

問好most vexing parse

StringHandler handler(QString(str));聲明名爲handler的函數,它需要QString並返回StringHandler。是。感謝C++解析規則。

現在的錯誤消息request for member 'str' in 'handler', which is of non-class type 'StringHandler(QString)'是有道理的:handler被當作StringHandler(QString)類型的函數,你要訪問一個名爲str在其成員,但當然功能沒有任何成員,因此編譯失敗。

可以利用統一初始化語法解決這個問題:

StringHandler handler{QString(str)}; 

以上不能被解析爲函數聲明,所以編譯應該失敗的預期原因:沒有匹配的構造函數QString(std::string)

欲瞭解更多信息,請參閱C++'s most vexing parse again