错误:C2039:“指针”:不是“QJsonObject::iterator”的成员

Posted

技术标签:

【中文标题】错误:C2039:“指针”:不是“QJsonObject::iterator”的成员【英文标题】:error: C2039: 'pointer' : is not a member of 'QJsonObject::iterator' 【发布时间】:2016-04-12 12:12:51 【问题描述】:

我在尝试将 'QJsonObject::iterator' 与 MSVC2013 一起使用时遇到了一个奇怪的错误。

我有以下例子:

#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 个编译器上工作?

【问题讨论】:

【参考方案1】:

使用 5.6 或向后移植:https://code.qt.io/cgit/qt/qtbase.git/commit/?id=4a318a61824216ac499ff8b0b0c55dea90501005

QJsonObject::(const_)iterator: 添加指针类型定义

否则它们无法与 std::algorithms 或其他任何东西一起使用 这需要 iterator_traits。

【讨论】:

以上是关于错误:C2039:“指针”:不是“QJsonObject::iterator”的成员的主要内容,如果未能解决你的问题,请参考以下文章

错误 C2039:“会话”:不是“pjsua_call”的成员

错误 C2039:“向量”:不是“标准”的成员

Visual Studio 2008,错误 c2039:“set_new_handler”:不是“std”的成员

qt 错误 多继承 造成错误:error C2039: “qt_metacall“: 不是 “xxxxxx“ 的成员

qt 错误 多继承 造成错误:error C2039: “qt_metacall“: 不是 “xxxxxx“ 的成员

错误 C2039:“IsNearDeath”:不是“Nan::Persistent<v8::Object,v8::NonCopyablePersistentTraits<T>>