C++ 标准-包括<;初始值设定项列表>;或者在编译时创建自己的定义会导致C2953错误

C++ 标准-包括<;初始值设定项列表>;或者在编译时创建自己的定义会导致C2953错误,c++,eastl,C++,Eastl,我正在尝试将EASTL用于我正在处理的项目,它无法编译,我能找到的唯一错误来自它的“EASTL/initializer_list.h”,我正在使用此文件的最新版本。出现的两个错误是C2953,另一个错误告诉我查看它的定义。EASTL自动禁用包含此文件的所有警告,甚至在其文件中使用它自己的定义。唯一的问题是,这包括了windows版本的文件,它仍然会导致错误,即使它应该包括刚刚好?我正在使用C++14,我的平台工具集是v142(Visual Studio 2019),我的Windows SDK版本

我正在尝试将EASTL用于我正在处理的项目,它无法编译,我能找到的唯一错误来自它的“EASTL/initializer_list.h”,我正在使用此文件的最新版本。出现的两个错误是C2953,另一个错误告诉我查看它的定义。EASTL自动禁用包含此文件的所有警告,甚至在其文件中使用它自己的定义。唯一的问题是,这包括了windows版本的文件,它仍然会导致错误,即使它应该包括刚刚好?我正在使用C++14,我的平台工具集是v142(Visual Studio 2019),我的Windows SDK版本是10.0;我知道is说要更新“EA_HAVE_CPP11_INITIALIZER_LIST define from”,我已经这么做了,所以这不应该是问题所在

以下是导致错误的代码:

#if defined(EA_HAVE_CPP11_INITIALIZER_LIST) // If the compiler can generate calls to std::initializer_list...

// The initializer_list type must be declared in the std namespace, as that's the 
// namespace the compiler uses when generating code to use it.
EA_DISABLE_ALL_VC_WARNINGS()
#include <initializer_list>
EA_RESTORE_ALL_VC_WARNINGS()

#else

// If you get an error here about initializer_list being already defined, then the         EA_HAVE_CPP11_INITIALIZER_LIST define from <EABase/eahave.h> needs to be updated.
namespace std
{
    // See the C++11 Standard, section 18.9.
    template<class E>
    class initializer_list
    {
    public:
        typedef E         value_type;
        typedef const E& reference;
        typedef const E& const_reference;
        typedef size_t    size_type;
        typedef const E* iterator;             // Must be const, as initializer_list (and its mpArray) is an immutable temp object.
        typedef const E* const_iterator;

    private:
        iterator  mpArray;
        size_type mArraySize;

        // This constructor is private, but the C++ compiler has the ability to call it, as per the C++11 Standard.
        initializer_list(const_iterator pArray, size_type arraySize)
            : mpArray(pArray), mArraySize(arraySize) { }

    public:
        initializer_list() EA_NOEXCEPT  // EA_NOEXCEPT requires a recent version of EABase.  
            : mpArray(NULL), mArraySize(0) { }

        size_type      size()  const EA_NOEXCEPT { return mArraySize; }
        const_iterator begin() const EA_NOEXCEPT { return mpArray; }            // Must be const_iterator, as initializer_list (and its mpArray) is an immutable temp object.
        const_iterator end()   const EA_NOEXCEPT { return mpArray + mArraySize; }
    };
}

#endif
#如果已定义(EA_HAVE_CPP11_INITIALIZER_LIST)//如果编译器可以生成对std::INITIALIZER_LIST的调用。。。
//必须在std命名空间中声明初始值设定项\u列表类型,因为这是
//编译器在生成使用它的代码时使用的命名空间。
EA_禁用所有VC_警告()
#包括
EA_RESTORE_ALL_VC_警告()
#否则
//如果您在这里得到关于已定义初始值设定项列表的错误,则需要更新EA_HAVE_CPP11_initializer_list define from。
名称空间标准
{
//参见C++11标准,第18.9节。
模板
类初始值设定项\u列表
{
公众:
类型定义E值_类型;
类型定义常量和参考;
类型定义常数E和常数参考;
typedef size_t size_type;
typedef const E*iterator;//必须是const,因为初始值设定项\u list(及其mpArray)是一个不可变的临时对象。
typedef常量E*常量迭代器;
私人:
迭代器mpArray;
大小\类型婚姻大小;
//这个构造函数是私有的,但是C++编译器有能力调用它,就像C++ 11标准一样。
初始值设定项列表(常量迭代器阵列、大小类型阵列)
:mpArray(pArray),mArraySize(arraySize){}
公众:
初始值设定项_list()EA_NOEXCEPT//EA_NOEXCEPT需要最新版本的EABase。
:mpArray(NULL),mArraySize(0){}
size_type size()常量EA_NOEXCEPT{return mArraySize;}
const_iterator begin()const EA_NOEXCEPT{return mpArray;}//必须是const_iterator,因为初始值设定项_list(及其mpArray)是一个不可变的临时对象。
常量迭代器end()常量EA_NOEXCEPT{return mpArray+mArraySize;}
};
}
#恩迪夫

我试着让它同时使用类的std版本和类的EA版本,这两个版本都会导致相同的错误(C2953)。任何帮助都是感激的,因为我希望能够尽快编译这篇文章

在一位朋友的帮助下解决了这个问题,这是一个包含订单的问题


修复方法是将“EA_HAVE_CPP11_INITIALIZER_LIST”放在预处理定义列表中。

您是否遵循了“如果您在此处发现有关已定义初始值设定项列表的错误[…]”注释中的建议?我刚刚编辑了问题,是的,我已经这样做了,但没有任何更改,不管怎样,这都不重要,因为我强迫它同时使用这两个定义,并且目前正在使用windows定义,它应该可以编译。请展示您是如何修改宏的。顺便说一句,我觉得有点奇怪,他们首先在std中添加了一些东西,看起来像是自找麻烦,现在你知道了,我所做的就是将宏定义更新到最新的eabase.h文件,可以在这里找到:我一直这么说,但我目前正在使用这个类的Windows STD定义,它仍然给出了这个错误。另外,他们只有在找不到std名称空间时才将自己版本的类添加到std名称空间中,他们并不打算每次编译都这样做。您是如何更新宏定义的?您如何强制它使用默认实现?(最简单的方法是将条件更改为
#如果1