5

J'ai le code qui se résume à ce qui suit:spécialisation partielle avec le paramètre de modèle de référence ne peut pas compiler dans 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); 
} 

Cette compile avec succès du CCAG, cependant, sous VS2005, je reçois:

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

Cependant, si je change const Foo<T>& I à const Foo<T>* I (en passant par le pointeur I plutôt que par référence), et définissant FloatFooBar que:

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

GCC et VS2005 sont tous deux satisfaits.

Que se passe-t-il? Est-ce une sorte d'échec subtil de substitution de template que VS2005 gère différemment avec GCC, ou un bug de compilateur?

(La chose la plus étrange: Je pensais J'ai eu le code ci-dessus travailler dans VS2005 plus tôt ce matin, mais qui était avant mon café du matin, je suis maintenant pas tout à fait certain que je n'étais pas sous une sorte de caféine.. envie induite par le délire ...)

+0

Le code semble être OK. On dirait un bug dans VS2005. –

+0

Le code compile avec Comeau en ligne, donc c'est probablement OK, limite à VS2005 – rotoglup

Répondre

0

Pour moi, il ressemble VS2005 utilise la première spécification du modèle de Baz

template <typename T> struct Baz {}; 

Ce struct ne fait pas contenir un membre nommé func. On dirait que VS2005 ne déduit pas les paramètres du template correctement.

+0

Ouais, ça ressemble de plus en plus à un bug dans VS. –