【问题标题】:Converting QString to float gives me errors将 QString 转换为浮点数会给我错误
【发布时间】:2020-01-23 22:42:58
【问题描述】:

我正在尝试将字符串转换为浮点数,反之亦然,但编译器会抱怨它。在编辑器中我得到implicit conversion increases floating-point precision: 'float' to 'double'。但据我所知,至少我不会将浮点数转换为双精度数。

C:\Qt\5.13.0\mingw73_64\include\QtCore\qstring.h:649: error: 'double QString::toFloat(bool*) const' cannot be overloaded
     double toFloat(bool *ok=nullptr) const;
            ^~~~~~~

在它的正下方:

C:\Qt\5.13.0\mingw73_64\include\QtCore\qstring.h:648: error: with 'float QString::toFloat(bool*) const'
     float toFloat(bool *ok=nullptr) const;
           ^~~~~~~

是我得到的,但我不知道为什么。我现在唯一能想象的是,c++ 无法判断我正在尝试使用哪个版本的toFloat。编译器在 QString 类中指出我可以看到两个版本的toFloat,除了返回类型之外它们是相同的。我真的不知道如何解决这个问题,所以我想要一些关于我应该在这里添加什么来解决它的指导。

else if (btnId == "=") {
 QRegExp separator("[(+|-|/|*)]");
    QStringList data = displayText.split(separator);

    bool ok = false;
    float result = 0.0;

    while (!data.isEmpty()) {
        QString str = data[0];
        data.pop_front();

        if (str == "+" || str == "-" || str == "/" || str == "*")
        {
            QString str2 = data[0];
            data.pop_front();

            if (str == "+") {
                double tmpF = str2.toFloat(&ok);
                result += tmpF;
            }
            else if (str == "-") {
                double tmpF = str2.toFloat(&ok);
                result -= tmpF;
            }
            else if (str == "/") {
                double tmpF = str2.toFloat(&ok);
                result /= tmpF;
            }
            else if (str == "*") {
                double tmpF = str2.toFloat(&ok);
                result *= tmpF;
            }
        }

        displayText.setNum(result, 'g', 6);
    }
}

【问题讨论】:

    标签: c++ qt floating-point qstring


    【解决方案1】:

    阅读课堂文档我发现

    double toFloat(bool *ok=nullptr) const;

    不应该存在。

    所以在 qstring.h 我改变了这个:

    float toFloat(bool *ok=nullptr) const;
    double toFloat(bool *ok=nullptr) const;
    

    到这里:

    float toFloat(bool *ok=nullptr) const;
    double toDouble(bool *ok=nullptr) const;
    

    我的程序停止抱怨并且运行良好。

    QT 版本是 5.13(如果重要:Windows 安装)。

    【讨论】:

    • 这很好奇。你是怎么得到那种头文件的?它不应该编译,因为返回类型不是 C++ 中函数签名的一部分,所以重载不能仅仅因为它们的返回类型而有所不同......你可能有一些有趣的 #define 宏或什么?跨度>
    • 尽管如此,您的 Qt SDK 安装显然有些问题。那时可能还有其他有趣的东西。如果我是你,我会重新安装...并检查新安装是否正常。
    • 你从哪里得到那个 qstring.h 头文件??? code.woboq.org/qt5/qtbase/src/corelib/text/qstring.h.html#752
    • @MaximPaperno 和 hyde,我只是按正常方式安装了 QT,并没有碰任何东西。
    【解决方案2】:

    但至少我没有将浮点数转换为双精度数 知道。

    是的,你这样做:

     double tmpF = str2.toFloat(&ok);
    

    在分配它之前隐式地将浮点“转换”为 tmpF...

    尝试投射之前

    auto x{str2.toFloat(&ok)};   
    if(ok)
        double tmpF = static_cast<double>(x);
    

    【讨论】:

    • 嗯,你是对的,阅读了我的问题,上面的代码是错误的版本。我实际上没有将浮点数转换为双精度,我在弄乱它的同时复制粘贴了代码。就这样结束了。在那个特定的例子中,我将所有内容都更改为 double 以查看这是否可行,但不知何故将代码粘贴到了一半。对此感到抱歉。我会编辑它。
    猜你喜欢
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2014-11-15
    相关资源
    最近更新 更多