Qt 在 QVariant 处抛出非法错误

Qt Throwing Illegal Error at QVariant

我有一些代码旨在从一组数据中获取 QMap 的 QList。然后它应该遍历该列表中的所有 QMap。出于某种原因,在尝试此操作时,我遇到了一些关于用于存储数据的 QVector 的错误。这是我的代码:

#include <QCoreApplication>
#include <QMap>
#include <QVariant>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QList<QMap<QString, QVariant>> maps;

    QMap<QString, QVariant> item1;
    item1.insert("Item 1", QVariant::fromValue(1));

    maps.append(item1);

    foreach (const QMap<QString, QVariant> & map, maps)
    {
        qDebug() << map;
    }

    return a.exec();
}

错误:

..\ErrorTest\main.cpp(17): warning C4002: too many actual parameters for macro 'Q_FOREACH'
..\ErrorTest\main.cpp(17): error C2275: 'QVariant': illegal use of this type as an expression
C:\Qt.8\msvc2015_64\include\QtCore/qsharedpointer_impl.h(94): note: see declaration of 'QVariant'
..\ErrorTest\main.cpp(17): error C2955: 'std::remove_reference': use of class template requires template argument list
D:\Microsoft Visual Studio 14.0\VC\INCLUDE\xtr1common(301): note: see declaration of 'std::remove_reference'
..\ErrorTest\main.cpp(17): error C2065: 'map': undeclared identifier
..\ErrorTest\main.cpp(17): error C2143: syntax error: missing ')' before '>'
..\ErrorTest\main.cpp(17): error C2059: syntax error: '>'
..\ErrorTest\main.cpp(17): error C2065: '_container_': undeclared identifier
..\ErrorTest\main.cpp(17): error C2228: left of '.control' must have class/struct/union
..\ErrorTest\main.cpp(17): note: type is 'unknown-type'
..\ErrorTest\main.cpp(17): error C2228: left of '.i' must have class/struct/union
..\ErrorTest\main.cpp(17): note: type is 'unknown-type'
..\ErrorTest\main.cpp(17): error C2228: left of '.e' must have class/struct/union
..\ErrorTest\main.cpp(17): note: type is 'unknown-type'
..\ErrorTest\main.cpp(17): error C2059: syntax error: ')'
..\ErrorTest\main.cpp(17): error C2143: syntax error: missing ';' before 'for'
..\ErrorTest\main.cpp(17): error C2059: syntax error: '='
..\ErrorTest\main.cpp(17): error C2143: syntax error: missing ';' before '}'
..\ErrorTest\main.cpp(17): fatal error C1004: unexpected end-of-file found

谢谢,是的 tagData->toMappedList() returns QMaps/data 的正确集合。

恕我直言,问题是模板中的 ,。可悲的是 foreach 只不过是对 Q_FOREACH 的调用,它是一个宏。它需要以逗号分隔的参数。但是由于模板,您有 2 个逗号。不久前我遇到了这个问题,尽管 Qt Creator 至少为我提供了 error: macro "Q_FOREACH" passed 3 arguments, but takes just 2 而不是你得到的大量错误。在您的情况下,这将是:

..\ErrorTest\main.cpp(17): warning C4002: too many actual parameters for macro 'Q_FOREACH'

我建议使用 for 循环和迭代器来遍历地图列表。除非你想转储 const 在这种情况下你可以这样做:

QMap<QString, QVariant> map;
foreach (map, maps) {
    ...
}

您也可以使用 auto 但同样 - 没有恒定性。

如果在您的案例中,恒定性是一个关键方面,请使用常量迭代器进行 for 循环。