从“已删除的函数”获取xmemory错误

时间:2018-07-06 17:40:55

标签: c++ visual-studio-2017

那么,有一点背景;我正在使用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的标签,是因为此错误似乎与人们所描述的“常量向量与常量向量”类似。据我所知,措词是完全相同的。

1 个答案:

答案 0 :(得分:0)

已删除的函数是副本构造函数。此错误消息表示“敌人”类不能复制。

Enemy(const Enemy&) = delete;

当您将对象添加到容器时,STL向量的分配器将创建对象的副本。使用指针:

std::vector<Enemy*> enemy_ptrs;
enemy_ptrs.push_back(new Enemy());

上面的向量现在复制对象所在地址的副本,而不是对象本身。只要记住要删除它们或使用C ++ 11 shared_ptrs。