2015-10-18 100 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