2014-10-23 2 views
1

При создании собственного распределителя в C++ 11 я реализую следующие интерфейсы. Это работает с вектором, но при попытке использовать это с картой я получаю ошибки в отсутствующих элементах. Я думал, что это все, что мне нужно реализовать для C++ 11, поскольку оно будет использовать allocator_traits в реализациях stl. Что мне здесь не хватает? Нужно ли мне определять больше методов/структур данных для распределителя для std :: map? При попытке компиляции в настоящее время я вижу следующие ошибки (см. Ниже). Строка 3 main.cpp всегоC++ 11 Интерфейсы по умолчанию Allocator Я должен предоставить

#include <map> 

template <class T> struct MyAllocator { 
    typedef T value_type; 
    MyAllocator() noexcept; // only required if used 
    MyAllocator(const MyAllocator&) noexcept; // copies must be equal 
    MyAllocator(MyAllocator&&) noexcept; // not needed if copy ctor is good enough 
    template <class U> MyAllocator(const MyAllocator<U>& u) noexcept; 
     // requires: *this == MyAllocator(u) 
    value_type* allocate(std::size_t); 
    void deallocate(value_type*, std::size_t) noexcept; 
}; 

template <class T, class U> bool 
operator==(const MyAllocator<T>&, const MyAllocator<U>&) noexcept; 

Ошибки:

In file included from /opt/gcc-4.8.1/usr/local/include/c++/4.8.1/map:61:0,
from main.cpp:3:
/opt/gcc-4.8.1/usr/local/include/c++/4.8.1/bits/stl_map.h: In instantiation of ‘class std::map, MyAlloc >’:
main.cpp:146:14: required from here
/opt/gcc-4.8.1/usr/local/include/c++/4.8.1/bits/stl_map.h:143:58: error: no type named ‘pointer’ in ‘std::map, MyAlloc >::_Pair_alloc_type {aka class MyAlloc, 200 typedef typename _Pair_alloc_type::pointer pointer; ^
/opt/gcc-4.8.1/usr/local/include/c++/4.8.1/bits/stl_map.h:144:58: error: no type named ‘const_pointer’ in ‘std::map, MyAlloc >::_Pair_alloc_type {aka class MyAlloc /opt/gcc-4.8.1/usr/local/include/c++/4.8.1/bits/stl_map.h:145:58: error: no type named ‘reference’ in ‘std::map, MyAlloc >::_Pair_alloc_type {aka class MyAlloc, 2 typedef typename _Pair_alloc_type::reference reference; ^
/opt/gcc-4.8.1/usr/local/include/c++/4.8.1/bits/stl_map.h:146:58: error: no type named ‘const_reference’ in ‘std::map, MyAlloc >::_Pair_alloc_type {aka class MyAlloc In file included from /opt/gcc-4.8.1/usr/local/include/c++/4.8.1/map:60:0,
from main.cpp:3:
/opt/gcc-4.8.1/usr/local/include/c++/4.8.1/bits/stl_tree.h: In instantiation of ‘void std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_destroy_node(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Link_t /opt/gcc-4.8.1/usr/local/include/c++/4.8.1/bits/stl_tree.h:1124:23:
required from ‘void std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_erase(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Link_type /opt/gcc-4.8.1/usr/local/include/c++/4.8.1/bits/stl_tree.h:671:28:
required from ‘std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::~_Rb_tree() [with _Key = int; _Val = std::pair; _KeyOfValue = std::
/opt/gcc-4.8.1/usr/local/include/c++/4.8.1/bits/stl_map.h:96:11:
required from here
/opt/gcc-4.8.1/usr/local/include/c++/4.8.1/bits/stl_tree.h:421:2: error: ‘std::_Rb_tree, std::_Select1st >, std::less, MyAlloc, 200ul> >:
_M_get_Node_allocator().destroy(__p); ^
make: *** [main.o] Error 1

+0

сведению это работает после добавления строить, разрушать и некоторые DEFS типа для указателя и т.д. Это просто, что во всех в литературе я не думал, что мне это нужно. – bjackfly

+0

некоторые из ваших строк слишком длинны – sp2danny

+0

Не могли бы вы отправить сообщение [MCVE] (http://stackoverflow.com/help/mcve)? Это облегчит людям помощь вам. [Ideone] (http://ideone.com) - полезный инструмент для демонстрации ошибок компиляции с меньшим количеством помех. –

ответ

0

В принципе, как мой комментарий предложил мне нужно поставить определения типов для следующей и конструкции и уничтожить

 template <class U> 
     struct rebind {typedef MyAlloc<U, N> other;}; 

     typedef size_t size_type;                                                  
     typedef ptrdiff_t difference_type; 
     typedef T* pointer; 
     typedef const T* const_pointer; 
     typedef T& reference;                                                   
     typedef const T& const_reference;                                                
     typedef T value_type;   

     /// Call constructor with many arguments                                              
     template<typename U, typename... Args>                                               
     void construct(U* p, Args&&... args)                                               
     {                                                        
      // Placement new                                                   
      ::new((void *)p) U(std::forward<Args>(args)...);                                           
     }                                                        
     /// Call destructor                                                    
     template<typename U>                                                   
     void destroy(U* p)                                                    
     {                                                        
      p->~U();                                                     
     }       
+0

Как странно. Согласно «Стандартной библиотеке C++ « Учебное пособие и справочник »Николая М. Йосуттиса (2-е издание), стр. 1026« Вам не нужно предоставлять конструкцию() или destroy(), потому что их реализации по умолчанию обычно работают нормально ». До этого он сказал, что вам нужно предоставить/a: (1) определение конструктора конструктора value_type (2) конструктора (3) (4) функции-члены allocate() и deallocate() (5) при необходимости, конструкторы и деструктор (6) операторы == и! =. «В остальном обычно предоставляются соответствующие значения по умолчанию». – Olumide

0

Первые ошибки решаются с помощью некоторых определений типов в MyAllocator:

typedef T& reference; 
typedef const T& const_reference; 
typedef T* pointer; 
typedef const T* const_pointer; 

Пожалуйста, напишите свой новый выход компиляции.

Смежные вопросы