Получение ошибок xmemory из «удаленной функции»

Итак, немного предыстории; Я использую Virtual Studio 2017 и изучаю C ++. Я только что загрузил шаблонный проект для работы, и есть один конкретный класс, класс 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);
}
};

Интересно, что этого не происходит, когда я делаю объекты; Это происходит, когда я помещаю их в векторный объект, чтобы сохранить их. Любая помощь будет принята с благодарностью!

постскриптум Я надеваю тег Visual Studio 2017, потому что кажется, что эта ошибка похожа на ту, что люди описывают как «константные векторы против вектора констант». Насколько я могу судить, формулировка точно такая же.

0

Решение

Удаленная функция является конструктором копирования. Это сообщение об ошибке означает, что класс «Враг» не предназначен для копирования.

Enemy(const Enemy&) = delete;

Распределитель для вектора STL сделает копии объектов, когда вы добавите их в контейнер. Используйте указатели:

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

Вектор, приведенный выше, теперь создает копии адреса, где находится объект, а не сам объект. Просто не забудьте удалить их или использовать C ++ 11 shared_ptrs.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]