我在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没有提供更多信息,我不知道如何解决这个问题。
答案 0 :(得分:1)
我读了这个和链接的文章只是为了看半小时后一条评论回答了这个问题:&#34;令人惊讶的是从默认构造函数中删除显式关键字和 copy-constructor 就是Visual Studio所需要的,现在代码编译成功了。&#34; 这对我有用。 我把它复制到一个答案,不是为了偷它,而是为了揭露它。