2012-03-22 18 views
16

Aquí está el códigocompilador interno Error: fallo de segmentación con g ++ 4.3.5

//fail_.cpp 
    template< unsigned char X, class L> 
    class A { 
     public: 
     typedef void (A::*fptr)(); 
     class B { 
      public: B(typename A< X, L> ::fptr); 
     }; 
    }; 
    template < unsigned char X, typename L > 
    A<X,L>::B::B (fptr) { } 

g++ -c fail_.cpp da

fail_.cpp:11: internal compiler error: Segmentation fault
Please submit a full bug report, with preprocessed source if appropriate.
See < file:///usr/share/doc/gcc-4.3/README.Bugs > for instructions.

Parece que un error para mí en g ++ 4.3.5, g ++ 4.4 y superior no dan ninguna segfault.

¿Qué piensan? ¿Hay algo mal con el código en sí?

+27

Un error de compilador interno siempre es un error. Si hay algo mal con el código, el compilador debería producir un mensaje de error real, no bloqueado. –

+0

me parece bien. Probablemente habría intentado simplificar la clase interna a 'clase B {public: B (fptr); }; '. El typedef debería ser visible allí. –

+1

Curiosamente, si escribo 'typename A < X, L> :: fptr' en la * definición *, compila bien: http://ideone.com/0OOpn – Nawaz

Respuesta

-1

typename se debe utilizar como un reemplazo para la clase en la sección de la plantilla.

En la clase interna B, pasar el puntero a la función no requiere la palabra clave typename, porque A < X, L> ya es conocido por el compilador en ese punto.

Y tal vez dar el nombre de tipo en frente del tipo está causando el compilador a malformación (¿puede ser un comportamiento indefinido?).

1

Veo un error similar con gcc 4.2. Como han dicho otros, un error interno significa que algo salió mal en el compilador, lo que hace que no implica que es su código el que estuvo mal.

Funciona bien en g ++ 4.6 y clang 3.0.

Cuestiones relacionadas