2011-06-10 22 views
25

El siguiente código:C++: Error de clases de plantilla anidadas "especialización explícita en el ámbito no-espacio de nombres"

template <class T1> 
struct A1 
{ 
    template <int INDEX> 
    struct A2 { /* ... */ }; 

    template <> 
    struct A2<-1> { /* ... */ }; 
}; 

int main() 
{ 
    A1<int>::A2<-1> x; 
} 

da este error:

prog.cpp:7:13: error: explicit specialization in non-namespace scope 'struct A1<T1>' prog.cpp:8:10: error: template parameters not used in partial specialization:
prog.cpp:8:10: error: 'T1'

¿Cómo evitar este error mejor? Intenté esto:

template <class T1> 
struct A1 
{ 
    template <int INDEX, class DUMMY = void> 
    struct A2 { /* ... */ }; 

    template <class DUMMY> 
    struct A2<-1, DUMMY> { /* ... */ }; 
}; 

int main() 
{ 
    A1<int>::A2<-1> x; 
} 

Lo que parece funcionar pero también parece un poco fudge.

¿Existe una forma mejor de solucionar este problema?

He revisado las respuestas anteriores y solo pude encontrar las que tienen funciones en las clases, no las clases en las clases. También encontré el truco "DUMMY" en otras respuestas, pero me preguntaba si existe una solución más agradable.

Además, como una nota al margen, ¿es el primer código permitido por C++ 0x?

+0

especializaciones de plantilla tienen que estar en el alcance de espacio de nombres, por lo que el compilador está esperando que haga algo como 'plantilla estructura A1 A2 :: <-1> {};' después de la definición struct A1, pero que no funciona bien. Estoy muy interesado en ver una respuesta a esto. En una nota al margen, Visual C++ permite su código, pero no es válido C++ estándar. – Sven

Respuesta

11

No está permitido especializar explícitamente A2 sin especializar A1 (§ 14.7.3/18). C++ 0x tiene la misma restricción (n3242 § 14.7.3/16). En el mismo momento, se permite una especialización parcial de una clase anidada. Entonces el truco con una clase ficticia es Ok.

+2

¿Cuál es el razonamiento detrás del estándar que no permite dicho código? Como, de lo contrario, existe un error de compilación, ¿por qué el estándar no debería indicar al compilador que inserte efectivamente las plantillas "DUMMY"? – Clinton

+0

@Clinton, consulte [this] (http://stackoverflow.com/questions/2537716/why-is-partial-specialziation-of-a-nested-class-template-allowed-while- complete) pregunta. –

Cuestiones relacionadas