I'm getting an internal compiler error in Visual Studio 2013. The exact error is
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.
Which points me to this code in the implementation of std::allocator_traits:
static _Alloc select_on_container_copy_construction(
const _Alloc& _Al)
{ // get allocator to use
return (_Alloc_select::_Fn(0, _Al));
}
From that I suppose the problem is related to an implementation I've made for a custom allocator. This allocator is a class template to wrap around simpler allocators that I use in my project and that don't conform to the standard (hence the need for wrapping). The wrapper is as follows:
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); }
};
Given Visual Studio doesn't provide any more information, I don't know how to tackle this problem.