visual studio 2013中的select_on_container_copy_construction内部错误

时间:2014-04-13 13:49:17

标签: c++ visual-studio-2013 allocator compiler-bug

我在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没有提供更多信息,我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

我读了这个和链接的文章只是为了看半小时后一条评论回答了这个问题:&#34;令人惊讶的是从默认构造函数中删除显式关键字 copy-constructor 就是Visual Studio所需要的,现在代码编译成功了。&#34; 这对我有用。 我把它复制到一个答案,不是为了偷它,而是为了揭露它。