У меня есть код, который сводится к следующему:
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);
}
Это успешно компилируется в GCC, однако в VS2005 я получаю:
error C2039: 'func' : is not a member of 'Baz<T>'
with
[
T=FloatFooBar
]
error C3861: 'func': identifier not found
Однако, если я изменю const Foo<T>& I
на const Foo<T>* I
(передавая I
по указателю, а не по ссылке) и определяя FloatFooBar
как:
typedef FooBar<float, &MyStruct::s_floatFoo> FloatFooBar;
И GCC, и VS2005 счастливы.
Что происходит? Является ли это какой-то тонкой ошибкой замены шаблона, которую VS2005 обрабатывает иначе, чем GCC, или ошибкой компилятора?
(Самое странное: я подумал У меня вышеупомянутый код работал сегодня утром в VS2005. Но это было до моего утреннего кофе. Теперь я не совсем уверен, что не был под каким-то делирия, вызванного жаждой кофеина ...)