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 ...)
Le code semble être OK. On dirait un bug dans VS2005. –
Le code compile avec Comeau en ligne, donc c'est probablement OK, limite à VS2005 – rotoglup