5

tengo código que se reduce a lo siguiente:especialización parcial con el parámetro de plantilla de referencia falla al compilar en VS2005

template <typename T> struct Foo {}; 
template <typename T, const Foo<T>& I> struct FooBar {}; 

//////// 

template <typename T> struct Baz {}; 

template <typename T, const Foo<T>& I> 
struct Baz< FooBar<T,I> > 
{ 
static void func(FooBar<T,I>& value); 
}; 

//////// 

struct MyStruct 
{ 
static const Foo<float> s_floatFoo; 
}; 

// Elsewhere: const Foo<float> MyStruct::s_floatFoo; 

void callBaz() 
{ 
typedef FooBar<float, MyStruct::s_floatFoo> FloatFooBar; 
FloatFooBar myFloatFooBar; 
Baz<FloatFooBar>::func(myFloatFooBar); 
} 

Esto compila con éxito bajo GCC, sin embargo, bajo VS2005, me sale:

error C2039: 'func' : is not a member of 'Baz<T>' 
     with 
     [ 
      T=FloatFooBar 
     ] 
error C3861: 'func': identifier not found 

Sin embargo, si cambio const Foo<T>& I a const Foo<T>* I (pasando I por puntero en lugar de por referencia), y que define FloatFooBar como:

typedef FooBar<float, &MyStruct::s_floatFoo> FloatFooBar; 

Tanto GCC como VS2005 están contentos.

¿Qué está pasando? ¿Es esto una especie de falla sutil de sustitución de plantilla que VS2005 maneja de manera diferente a GCC, o un error de compilación?

(Lo más extraño: me pensado que tenía el código anterior que trabaja en VS2005 a principios de esta mañana, pero eso fue antes de mi café de la mañana estoy ahora no es del todo cierto que no estaba bajo algún tipo de cafeína.. antojo delirio inducido ...)

+0

Parece que el código está bien. Parece un error en VS2005. –

+0

El código se compila con Comeau en línea, por lo que probablemente esté bien, limite a VS2005 – rotoglup

Respuesta

0

Para mí parece que VS2005 utiliza la primera especificación de plantilla de Baz

template <typename T> struct Baz {}; 

Esta estructura de hecho no contiene un miembro nombrado func. Parece que VS2005 no deduce correctamente los parámetros de la plantilla.

+0

Sí, cada vez se parece más a un error en VS. –

Cuestiones relacionadas