Qt中的foreach有啥问题?

Posted

技术标签:

【中文标题】Qt中的foreach有啥问题?【英文标题】:What is wrong with foreach in Qt?Qt中的foreach有什么问题? 【发布时间】:2015-11-13 15:10:16 【问题描述】:

嗯,我都试过了。这应该很简单,但我很想知道我的 foreach 到底发生了什么。它只是没有帮助。

    #include <QCoreApplication> 
    //coreapplication or Qapplication the error is there
    #include <QList>
    #include <QDebug>

    int main()
    
      QList<int> list;

      list << 1 << 2 << 3 << 4 << 5;

      foreach (int i, list) //expected token ';' got 'int'.
      
        qDebug() << i;
      
    
    /*
    QT += core gui

    TARGET = QtTest
    CONFIG += console
    CONFIG -= app_bundle
    CONFIG += no_keywords

    TEMPLATE = app

    SOURCES += main.cpp

    */

【问题讨论】:

在我的情况下它工作正常,Qt 5.2。你的qt版本是多少?您还为每种语法尝试过 C++11 吗? 5.5.1....我看网站和qt助手一样,O_o一样... 也许 foreach 已为您的设置禁用。请改用Q_FOREACH 【参考方案1】:

您在配置中指定了no_keywords。您必须使用Q_FOREACH 而不是foreach。请参阅documentation 获取foreach

话虽如此,我会切换到基于 C++11 范围的for,因为它在类型中没有逗号问题。例如,

Q_FOREACH (QPair<int, int> p, pairList)

不会编译,因为预处理器认为您正在尝试使用 3 个参数而不是 2 个参数调用宏。

【讨论】:

可以使用 typedef 解决逗号问题,但是是的,如果可以使用基于范围的 for 是首选。 有趣的是,我得到了同样的错误,但我有正确的项目配置。不仅如此,foreach 适用于 Qt 容器,但不适用于包含 int 等原始类型的数组【参考方案2】:

您可以改为使用C++11 for(:):

for(int i:list)

    qDebug() << i;

请注意,您必须使用C++-11 标志进行编译,因此将此行添加到您的项目文件中:

QMAKE_CXXFLAGS += -std=c++11

请注意,C++11 for 比 Qt foreach 更高效,如下所示:Qt foreach loop ordering vs. for loop for QList

编辑: 就像 Frank Osterfeld 评论的那样,您也可以使用:

CONFIG+=c++11

在您的 .pro 文件中,自 Qt 5.4 起如下评论:How to use C++11 in your Qt Projects.

【讨论】:

是的,那个似乎也不起作用,它给了我一个错误:C++ 98 模式下不允许基于范围的“for”循环。 nvm.. 我错过了这一步.. 是的,它可以工作,但仍然......我想用 foreach 练习,但令人惊讶的是它在我的机器上不起作用。 我会使用 CONFIG+=c++11 而不是 "QMAKE_CXXFLAGS += -std=c++11"

以上是关于Qt中的foreach有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

foreach 中的泛型类型有啥意义?

使用 foreach 或在 Perl 中迭代文件有啥区别?

Qt foreach() 仅迭代一次,忽略其余项目

如何在 Qt 中将 foreach 与 QDomNodeList 一起使用?

.map、.every 和 .forEach 之间有啥区别?

SwiftUI 中的 ForEach