将 QString 转换为 float 会出现错误。

4

我试图将一个字符串转换为浮点数,反之亦然,但编译器对此进行了抱怨。在编辑器中,我收到了 implicit conversion increases floating-point precision: 'float' to 'double' 的警告信息,但我至少不知道自己正在将float转换为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);
    }
}
2个回答

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安装)。

2
这很奇怪。你是怎么得到那种头文件的?它不应该编译通过,因为在C++中返回类型不是函数签名的一部分,所以重载根本不能仅通过它们的返回类型来区分... 也许你有一些有趣的#define宏或其他东西吗? - hyde
2
不管怎样,你的Qt SDK安装显然出了些问题。可能还有其他奇怪的东西。如果我是你,我会重新安装……并检查新安装是否正常。 - hyde
你从哪里得到了那个 qstring.h 头文件???https://code.woboq.org/qt5/qtbase/src/corelib/text/qstring.h.html#752 - Maxim Paperno
@MaximPaperno 和 hyde,我只是正常安装了QT,并没有对它进行任何更改。 - Not Amused

1

但是据我所知,至少在这个过程中,我没有将float转换为double。

是的,你正在这样做:

 double tmpF = str2.toFloat(&ok);

这里隐式地将浮点数转换为tmpF,然后再进行赋值...

尝试在之前进行类型转换

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

嗯,你通过阅读我的问题是正确的,其中代码版本是错误的。 实际上我没有将float转换为double,而是在搞乱它时复制粘贴了代码。 结果就是这样。在那个特定的实例中,我正在将所有内容更改为double以查看是否有效,但不知何故只粘贴了一半的代码。 对此我很抱歉。我会进行编辑。 - Not Amused

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接