2

我在 Visual Studio 2013 中遇到内部编译器错误。确切的错误是

c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(487): fatal error     C1001: An internal error has occurred in the compiler.
2>  (compiler file 'f:\dd\vctools\compiler\utc\src\p2\ehexcept.c', line 1483)
2>   To work around this problem, try simplifying or changing the program near the locations listed above.

这指向我在 std::allocator_traits 的实现中的这段代码:

static _Alloc select_on_container_copy_construction(
    const _Alloc& _Al)
    {   // get allocator to use
    return (_Alloc_select::_Fn(0, _Al));
    }

我认为问题与我为自定义分配器所做的实现有关。这个分配器是一个类模板,用于包装我在项目中使用且不符合标准的更简单的分配器(因此需要包装)。包装如下:

template<class BaseAlloc_, class T_>
    class StdAllocator : public BaseAlloc_ {
    public:
        // Public types
        typedef T_              value_type;
        typedef T_*             pointer;
        typedef const T_*       const_pointer;
        typedef T_&             reference;
        typedef const T_&       const_reference;
        typedef std::size_t     size_type;
        typedef std::ptrdiff_t  difference_type;

    public:
        // Convert an allocator<T_> to allocator<U_>
        template<typename U_>
        struct rebind {
            typedef StdAllocator<BaseAlloc_,U_> other;
        };

    public:
        inline explicit StdAllocator():BaseAlloc_() {}
        inline explicit StdAllocator(BaseAlloc_ _b) :BaseAlloc_(_b) {}
        inline ~StdAllocator() {}
        inline explicit StdAllocator(StdAllocator const& _x) :BaseAlloc_(_x) {}
        template<typename U>
        inline explicit StdAllocator(StdAllocator<BaseAlloc_,U> const&) :BaseAlloc_() {}

        //    address
        inline pointer address(reference r) { return &r; }
        inline const_pointer address(const_reference r) { return &r; }

        //    memory allocation
        inline pointer allocate(size_type _cnt,
            typename std::allocator<void>::const_pointer = 0) {
            return BaseAlloc_::allocate<T_>(_cnt);
        }
        inline void deallocate(pointer _p, size_type _cnt) {
            BaseAlloc_::deallocate(_p,_cnt);
        }

        //    size
        inline size_type max_size() const {
            return std::numeric_limits<size_type>::max() / sizeof(T_);
        }

        //    construction/destruction
        inline void construct(pointer p, const T_& t) { new(p)T_(t); }
        inline void destroy(pointer _p) { 
            _p; // Work around for visual studio incorrect warning
            _p->~T_();
        }

        inline bool operator==(StdAllocator const&) { return true; }
        inline bool operator!=(StdAllocator const& a) { return !operator==(a); }
    };

鉴于 Visual Studio 没有提供更多信息,我不知道如何解决这个问题。

4

1 回答 1

1

我读了这篇文章和链接的文章,半小时后才看到一条评论回答了这个问题:“令人惊讶的是,Visual Studio 只需要从默认构造函数复制构造函数中删除显式关键字,现在代码编译成功。 " 这对我有用。我将它复制到一个答案不是为了窃取它而是为了暴露它。

于 2016-03-30T08:22:46.997 回答