那么,有一点背景;我正在使用Virtual Studio 2017,正在学习C ++。我刚刚下载了一个模板项目进行工作,并且有一个特定的类,即Enemy类(它是一种自上而下的射击类东西),这会导致超级混乱的错误。
Enemy :: Enemy(const Enemy&)':尝试引用已删除的函数
问题是,此错误似乎只发生在我正在使用的计算机上。该错误似乎发生在xmemory文件的此类中(错误日志告诉我它在哪里),特别是倒数第四个函数中:
template<class _Alloc>
struct _Default_allocator_traits
{ // traits for std::allocator
using allocator_type = _Alloc;
using value_type = typename _Alloc::value_type;
using pointer = value_type *;
using const_pointer = const value_type *;
using void_pointer = void *;
using const_void_pointer = const void *;
using size_type = size_t;
using difference_type = ptrdiff_t;
using propagate_on_container_copy_assignment = false_type;
using propagate_on_container_move_assignment = true_type;
using propagate_on_container_swap = false_type;
using is_always_equal = true_type;
template<class _Other>
using rebind_alloc = allocator<_Other>;
template<class _Other>
using rebind_traits = allocator_traits<allocator<_Other>>;
_NODISCARD static _DECLSPEC_ALLOCATOR pointer allocate(_Alloc&, _CRT_GUARDOVERFLOW const size_type _Count)
{ // allocate array of _Count elements
return (static_cast<pointer>(_Allocate<_New_alignof<value_type>>(_Get_size_of_n<sizeof(value_type)>(_Count))));
}
_NODISCARD static _DECLSPEC_ALLOCATOR pointer allocate(_Alloc&, _CRT_GUARDOVERFLOW const size_type _Count,
const_void_pointer)
{ // allocate array of _Count elements, with hint
return (static_cast<pointer>(_Allocate<_New_alignof<value_type>>(_Get_size_of_n<sizeof(value_type)>(_Count))));
}
static void deallocate(_Alloc&, const pointer _Ptr, const size_type _Count)
{ // deallocate _Count elements at _Ptr
// no overflow check on the following multiply; we assume _Allocate did that check
_Deallocate<_New_alignof<value_type>>(_Ptr, sizeof(value_type) * _Count);
}
template<class _Objty,
class... _Types>
static void construct(_Alloc&, _Objty * const _Ptr, _Types&&... _Args)
{ // construct _Objty(_Types...) at _Ptr
::new (const_cast<void *>(static_cast<const volatile void *>(_Ptr)))
_Objty(_STD forward<_Types>(_Args)...);
}
template<class _Uty>
static void destroy(_Alloc&, _Uty * const _Ptr)
{ // destroy object at _Ptr
_Ptr->~_Uty();
}
_NODISCARD static size_type max_size(const _Alloc&) _NOEXCEPT
{ // get maximum size
return (static_cast<size_t>(-1) / sizeof(value_type));
}
_NODISCARD static _Alloc select_on_container_copy_construction(const _Alloc& _Al)
{ // get allocator to use
return (_Al);
}
};
有趣的是,当我制作对象时,不会发生这种情况。我将它们放在矢量对象中进行存储时会发生这种情况。任何帮助将不胜感激!
p.s。我之所以加上Visual Studio 2017的标签,是因为此错误似乎与人们所描述的“常量向量与常量向量”类似。据我所知,措词是完全相同的。
答案 0 :(得分:0)
已删除的函数是副本构造函数。此错误消息表示“敌人”类不能复制。
Enemy(const Enemy&) = delete;
当您将对象添加到容器时,STL向量的分配器将创建对象的副本。使用指针:
std::vector<Enemy*> enemy_ptrs;
enemy_ptrs.push_back(new Enemy());
上面的向量现在复制对象所在地址的副本,而不是对象本身。只要记住要删除它们或使用C ++ 11 shared_ptrs。