Частичная специализация с параметром шаблона ссылки не компилируется в VS2005 - PullRequest
5 голосов
/ 18 мая 2010

У меня есть код, который сводится к следующему:

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. Но это было до моего утреннего кофе. Теперь я не совсем уверен, что не был под каким-то делирия, вызванного жаждой кофеина ...)

1 Ответ

0 голосов
/ 18 мая 2010

Для меня, похоже, VS2005 использует первую спецификацию шаблона Baz

template <typename T> struct Baz {};

Эта структура действительно не содержит члена с именем func. Похоже, VS2005 неправильно выводит параметры шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...