Собственный распределитель и std::mapC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Собственный распределитель и std::map

Сообщение Anonymous »


Вот код, который я могу скомпилировать с помощью gcc:

#include #include шаблон класс map_alloc { публика: typedef std::size_t size_type; typedef std::ptrdiff_t Different_type; указатель typedef T*; typedef const T* const_pointer; typedef T& ссылка; typedef const T& const_reference; typedef T value_type; шаблон структура перепривязать { typedef map_alloc другое; }; указатель allocate(size_type n, const void*hint = 0) { T* t = (T*) malloc ( n * sizeof(T) ); вернуть т; } void освобождение (указатель p, size_type n) { бесплатно (п); } }; typedef map_alloc распределитель; интервал основной() { std::map dummy; (пустота)(манекен); вернуть 0; } Но попытка компиляции с помощью MSVC завершилась неудачно с довольно странной ошибкой (прикреплена ниже).

Протестировано:

g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 Сообщество msvc 2022, набор инструментов v143.

Есть идеи? Любой пример специального распределителя памяти для std::map в MSVC?

Спасибо.

Сборка началась в 1:02... 1>------ Сборка началась: Проект: malloc_tester, Конфигурация: Отладка x64 ------ 1>alloc_tester.cpp 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): ошибка C2440: «static_cast»: невозможно преобразовать из «map_alloc» ' в 'map_alloc' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): ошибка C2440: с 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): ошибка C2440: [ 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): ошибка C2440: U=std::_Tree_node,std::_Default_allocator_traits::void_pointer> 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): ошибка C2440: ] 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): ошибка C2440: и 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): ошибка C2440: [ 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): ошибка C2440: U=std::_Container_proxy 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): ошибка C2440: ] 1>(компиляция исходного файла alloc_tester.cpp) 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): 1>'map_alloc::map_alloc': ни одна перегруженная функция не может преобразовать все типы аргументов 1> с 1> [ 1> U=std::_Container_proxy 1> ] 1> C:\Temp\ConsoleApplication4\malloc_tester\alloc_tester.cpp(29,1): 1> может быть 'map_alloc::map_alloc(map_alloc &&)' 1> с 1> [ 1> U=std::_Container_proxy 1> ] 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): 1> 'map_alloc::map_alloc(map_alloc &&)': невозможно преобразовать аргумент 1 из 'map_alloc' в 'map_alloc &&' 1> с 1> [ 1> U=std::_Container_proxy 1> ] 1> и 1> [ 1> U=std::_Tree_node 1> ] 1> и 1> [ 1> U=std::_Container_proxy 1> ] 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): 1> Причина: невозможно преобразовать «map_alloc» в «map_alloc». 1> с 1> [ 1> U=std::_Tree_node 1> ] 1> и 1> [ 1> U=std::_Container_proxy 1> ] 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): 1> Нет доступного оператора преобразования, определяемого пользователем, который может выполнить это преобразование, или оператор не может быть вызван. 1> C:\Temp\ConsoleApplication4\malloc_tester\alloc_tester.cpp(29,1): 1> или 'map_alloc::map_alloc(const map_alloc &)' 1> с 1> [ 1> U=std::_Container_proxy 1> ] 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): 1> 'map_alloc::map_alloc(const map_alloc &)': невозможно преобразовать аргумент 1 из 'map_alloc' в 'const map_alloc &' 1> с 1> [ 1> U=std::_Container_proxy 1> ] 1> и 1> [ 1> U=std::_Tree_node 1> ] 1> и 1> [ 1> U=std::_Container_proxy 1> ] 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): 1> Причина: невозможно преобразовать «map_alloc» в «const map_alloc» 1> с 1> [ 1> U=std::_Tree_node 1> ] 1> и 1> [ 1> U=std::_Container_proxy 1> ] 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): 1> Нет доступного оператора преобразования, определяемого пользователем, который мог бы выполнить это преобразование, или оператор не может быть вызван. 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): 1> при попытке сопоставить список аргументов '(map_alloc)' 1> с 1> [ 1> U=std::_Tree_node 1> ] 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,27): 1> контекст создания шаблона (сначала самый старый) 1> C:\Temp\ConsoleApplication4\malloc_tester\alloc_tester.cpp(34,50): 1> см. ссылку на компилируемый экземпляр шаблона класса 'std::map' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\map(72,20): 1> см. ссылку на компилируемый экземпляр шаблона класса 'std::_Tree' 1> с 1> [ 1> _Kty=int, 1> _Ty=int, 1> _Pr=std::less, 1> _Alloc=распределитель 1> ] 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1071,6): 1> при компиляции функции-члена шаблона класса 'std::_Tree::~_Tree(void) noException' 1> с 1> [ 1> _Kty=int, 1> _Ty=int, 1> _Pr=std::less, 1> _Alloc=распределитель 1> ] 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\map(369,1): 1> см. первую ссылку на 'std::_Tree::~_Tree' в 'std::map,распределитель>::~map' 1> с 1> [ 1> _Kty=int, 1> _Ty=int, 1> _Pr=std::less, 1> _Alloc=распределитель 1> ] 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1075,25): ошибка C2530: «_Alproxy»: ссылки должны быть инициализированы 1>(компиляция исходного файла alloc_tester.cpp) 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1076,32): ошибка C3536: «_Alproxy»: нельзя использовать до его инициализации 1>(компиляция исходного файла alloc_tester.cpp) 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1076,9): ошибка C2672: '_Delete_plain_internal': не найдена соответствующая перегруженная функция 1>(компиляция исходного файла alloc_tester.cpp) 1>C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xmemory(1135,19): 1>может быть 'void std::_Delete_plain_internal(_Alloc &,_Alloc::value_type *const) noException' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1076,9): 1> Не удалось специализировать шаблон функции 'void std::_Delete_plain_internal(_Alloc &,_Alloc::value_type *const ) noException' 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1076,9): 1> Со следующими аргументами шаблона: 1> C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\xtree(1076,9): 1> '_Alloc=int' 1>Завершено создание проекта «malloc_tester.vcxproj» — ОШИБКА. ========== Сборка: 0 выполнена успешно, 1 не выполнена, 0 обновлено, 0 пропущено ========== ========== Сборка завершена в 1:02 и заняла 00,554 секунды ========== Протестировано на разных версиях MSVC. Я не могу найти пример работы в Интернете.

Я нашел один пример здесь: https://github.com/moya-lang/Allocator/tree/master

Та же проблема, та же ошибка компилятора.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • `std::map<std::string, enum{1, 2, 3, 4}>` (или std::map<std::string, tuple<bool, bool>>`) кэширует` против `std: :set<st
    Anonymous » » в форуме C++
    0 Ответы
    317 Просмотры
    Последнее сообщение Anonymous
  • Собственный распределитель и std::map
    Anonymous » » в форуме C++
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous
  • Пользовательский распределитель C++ и структура с std::vector [дубликат]
    Anonymous » » в форуме C++
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Std::vector не очищает память или плохой пользовательский распределитель? [дубликат]
    Anonymous » » в форуме C++
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Разыменовывает ли std::map, где ключом является указатель, или вам нужен собственный компаратор?
    Anonymous » » в форуме C++
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»