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?
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