2012-09-20 11 views
5

¿Por qué no se compila this code?Asignador personalizado y miembro predeterminado

#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; 
} 

Se parece necesitar puntero, referencia, pointer_const & tipos reference_const. Sin embargo, según cppreference, estos miembros son todos opcionales. Parece que si el STL no usa allocator_trait (estoy compilando con -std = C++ 11, así que debería ser bueno).

¿Alguna idea?

[editar] El sonido metálico, los errores son:

[email protected]/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. 
+0

¿Cuál es el error? – Nick

+0

@Nick He actualizado mi pregunta con salida de clang (gcc también está fallando) –

+0

Tenga en cuenta que el soporte de C++ 11 para básicamente todos los compiladores aún es experimental/incompleto. Por lo tanto, podría ser simplemente un error de implementación (no se pueden buscar las partes relevantes del estándar en este momento, así que solo es una suposición si esos miembros son de hecho opcionales) – Grizzly

Respuesta

2

trata de un error en la biblioteca estándar de C++ de GCC.

Al usar una lista, no están envolviendo correctamente el acceso al asignador a través de allocator_traits.

Sin embargo, implementan el vector correctamente. Este código se compilaría si usó std::vector en lugar de std::list.

Cuestiones relacionadas