在构造函数中将 std::string 转换为 QString
Converting std::string to QString in constructor
我不明白为什么 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();
}
StringHandler handler(QString(str));
声明了一个名为 handler
的函数,它接受一个 QString
和 returns 一个 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。
我不明白为什么 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();
}
StringHandler handler(QString(str));
声明了一个名为 handler
的函数,它接受一个 QString
和 returns 一个 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。