Considérese la clase siguiente:Parámetros no dependientes del tipo de plantilla
class Foo
{
enum Flags {Bar, Baz, Bax};
template<Flags, class = void> struct Internal;
template<class unused> struct Internal<Bar, unused> {/* ... */};
template<class unused> struct Internal<Baz, unused> {/* ... */};
template<class unused> struct Internal<Bax, unused> {/* ... */};
};
El esquema de la clase anterior compila y funciona como se esperaba cuando se prueba en VC++ 2010 y Comeau C++. Sin embargo, cuando Foo
se hace en una plantilla en sí, las roturas anteriormente fragmento de bajo VC++ 2010.
Por ejemplo, el siguiente fragmento:
template<class> class Foo
{
// Same contents as the original non-templated Foo.
};
produce el siguiente error class:
C2754: 'Foo<<unnamed-symbol>>::Internal<Bar,unused>' : a partial specialization cannot have a dependent non-type template parameter
C2754: 'Foo<<unnamed-symbol>>::Internal<Baz,unused>' : a partial specialization cannot have a dependent non-type template parameter
C2754: 'Foo<<unnamed-symbol>>::Internal<Bax,unused>' : a partial specialization cannot have a dependent non-type template parameter
- ¿Puede alguien explicar lo que está pasando aquí en inglés?
- ¿Cómo puedo solucionar esto (es decir, mantener las especializaciones pseudoexplícitas internas en una plantilla de
Foo
) en VC++ 2010?
Yo diría que los mensajes de error son falsos. FWIW, Comeau acepta el código incluso si 'Foo' es una plantilla. Sugiero que intentes en uno de los grupos de noticias de MS. La gente del compilador de MS solía pasar el rato allí. – sbi