0

MSVC2013 で「QJsonObject::iterator」を使用しようとすると、奇妙なエラーが発生します。

次の例があります。

#include <QCoreApplication>
#include <QJsonObject>
#include <QDebug>
#include <algorithm>

void processValue(QJsonValue value) {
    qDebug() << value.toString();
}

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

    QJsonObject jsonObject;
    jsonObject.insert("a", "A");
    jsonObject.insert("b", "B");
    jsonObject.insert("c", "C");
    jsonObject.insert("d", "D");
    jsonObject.insert("e", "E");

    std::for_each (jsonObject.begin(), jsonObject.end(), processValue);

    return a.exec();
}

このコードは、MSVC2008 (WinCE へのクロスコンパイル) および MinGW では期待どおりにコンパイルおよび動作しますが、MSVC2013 では期待どおりに動作しません。いずれの場合も、Qt 5.5.1 を使用しています。

エラーメッセージは次のとおりです。

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\xutility(375) : error C2039: 'pointer' : is not a member of 'QJsonObject::iterator'
        c:\qt\qt5.5.1msvc\5.5\msvc2013\include\qtcore\qjsonobject.h(96) : see declaration of 'QJsonObject::iterator'
        C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\xutility(584) : see reference to class template instantiation 'std::iterator_traits<_InIt>' being compiled
        with
        [
            _InIt=QJsonObject::iterator
        ]
        C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\algorithm(31) : see reference to function template instantiation 'void std::_Debug_range<_InIt>(_InIt,_InIt,std::_Dbfile_t,std::_Dbline_t)' being compiled
        with
        [
            _InIt=QJsonObject::iterator
        ]
        ..\QJsonObjectIteratorIssue\main.cpp(21) : see reference to function template instantiation '_Fn1 std::for_each<QJsonObject::iterator,void(__cdecl *)(QJsonValue)>(_InIt,_InIt,_Fn1)' being compiled
        with
        [
            _Fn1=void (__cdecl *)(QJsonValue)
,            _InIt=QJsonObject::iterator
        ]
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\xutility(375) : error C2146: syntax error : missing ';' before identifier 'pointer'
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\xutility(375) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\xutility(375) : error C2602: 'std::iterator_traits<_InIt>::pointer' is not a member of a base class of 'std::iterator_traits<_InIt>'
        with
        [
            _InIt=QJsonObject::iterator
        ]
        C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\xutility(375) : see declaration of 'std::iterator_traits<_InIt>::pointer'
        with
        [
            _InIt=QJsonObject::iterator
        ]
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\xutility(375) : error C2868: 'std::iterator_traits<_InIt>::pointer' : illegal syntax for using-declaration; expected qualified-name
        with
        [
            _InIt=QJsonObject::iterator
        ]

私はここで何か間違ったことをしていますか?それはたまたま他の2つのコンパイラでうまくいきますか?

4

1 に答える 1

3

5.6 を使用するか、これをバックポートします。

QJsonObject::(const_)iterator: ポインター typedef を追加

それ以外の場合、std::algorithms または iterator_traits を必要とするその他のものでは使用できません。

于 2016-04-12T12:16:35.950 に答える