Custom allocator and default item

Why isn't this code compiling?

#include <cstdlib>
#include <list>

template < typename Type >
class Allocator {
public:
    using value_type = Type;
public:
    template < typename Other >
    struct rebind { using other = Allocator< Other >; };
public:
    Type * allocate( std::size_t n ) { return std::malloc( n ); }
    void deallocate( Type * p, std::size_t ) throw ( ) { std::free( p ); }
};

int main( void ) {
    std::list< void *, Allocator< void * > > list;
    return 0;
}

It seems like pointers, references, pointer_const and reference_const are needed. However, according to cppreference , these members are all kinds. It seems that if STL did not use allocator_trait (I am compiling with -std = C ++ 11, so this should be fine).

Any idea?

[edit] In clang errors:

user@/tmp > clang++ -std=c++11 test.cc
In file included from test.cc:2:
In file included from /usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/list:63:
/usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/bits/stl_list.h:449:40: error: no type named 'pointer' in 'Allocator<void *>'
      typedef typename _Tp_alloc_type::pointer           pointer;
              ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
test.cc:17:46: note: in instantiation of template class 'std::list<void *, Allocator<void *> >' requested here
    std::list< void *, Allocator< void * > > list;
                                             ^
In file included from test.cc:2:
In file included from /usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/list:63:
/usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/bits/stl_list.h:450:40: error: no type named 'const_pointer' in 'Allocator<void *>'
      typedef typename _Tp_alloc_type::const_pointer     const_pointer;
              ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
/usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/bits/stl_list.h:451:40: error: no type named 'reference' in 'Allocator<void *>'
      typedef typename _Tp_alloc_type::reference         reference;
              ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~
/usr/lib/gcc/i686-pc-linux-gnu/4.7.1/../../../../include/c++/4.7.1/bits/stl_list.h:452:40: error: no type named 'const_reference' in 'Allocator<void *>'
      typedef typename _Tp_alloc_type::const_reference   const_reference;
              ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
4 errors generated.
+5
source share
1 answer

This is a bug in the GCC C ++ Standard Library.

When using a list, they do not properly transfer access to the distributor via allocator_traits.

However, they correctly implement the vector. This code will be compiled if you used std::vectorinstead std::list.

+2

All Articles