【问题标题】:Converting std::string to QString in constructor在构造函数中将 std::string 转换为 QString
【发布时间】:2016-01-16 17:59:55
【问题描述】:

我不明白为什么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();
}

【问题讨论】:

  • 请添加实际的错误输出。
  • @zenith 问题不在于错误。我不明白为什么这条线:StringHandler handler(QString(str)) 有效。
  • 如果您删除 QString qstr(str); 行并保留另一行,它是否可以编译?
  • 真的,我们需要你在非工作状态下得到的编译器错误。 这通常不应该工作

标签: c++ constructor compiler-errors most-vexing-parse


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 2011-05-19
    • 2013-05-11
    • 2011-05-11
    • 2014-09-08
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多