Итак, немного предыстории; Я использую 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, потому что кажется, что эта ошибка похожа на ту, что люди описывают как «константные векторы против вектора констант». Насколько я могу судить, формулировка точно такая же.
Удаленная функция является конструктором копирования. Это сообщение об ошибке означает, что класс «Враг» не предназначен для копирования.
Enemy(const Enemy&) = delete;
Распределитель для вектора STL сделает копии объектов, когда вы добавите их в контейнер. Используйте указатели:
std::vector<Enemy*> enemy_ptrs;
enemy_ptrs.push_back(new Enemy());
Вектор, приведенный выше, теперь создает копии адреса, где находится объект, а не сам объект. Просто не забудьте удалить их или использовать C ++ 11 shared_ptrs.
Других решений пока нет …