параметры шаблона в функции шаблонного типа - PullRequest
0 голосов
/ 13 мая 2018

Следующий код не компилируется с gcc 6.4 в Debian Sid из-за ошибки: «имя типа не разрешено».

struct A
{
template <typename T,typename R> static R f(T x)
{
    return (R)x;
}
};
template <class FUNCTION,typename T,typename R> R func()
{
    return FUNCTION::f<T,R>(2);
}
int main()
{
    return func<A,int,double>();
}

Интересно, что следующий код компилируется:

struct A
{
template <typename T> static T f(T x)
{
    return x;
}
};
template <class FUNCTION,typename T> T func()
{
    return FUNCTION::f(2.f);
}
int main()
{
    return func<A,float>();
}

Я предполагаю, что второй код компилируется, потому что аргумент функции предоставляет достаточно информации для GCC, чтобы выполнить замену шаблона. Однако я не понимаю, почему первый код не компилируется. Так кто-нибудь может объяснить мне, почему?

1 Ответ

0 голосов
/ 13 мая 2018

Вам нужно использовать ключевое слово template, чтобы сообщить компилятору, что зависимое имя f (зависит от параметра шаблона FUNCTION) является именем шаблона. Только когда компилятор знает, что это имя шаблона, он принимает < в качестве начала списка аргументов шаблона, в противном случае он попытается принять < в качестве оператора меньше чем.

1010 *, например *

return FUNCTION::template f<T,R>(2);
//               ~~~~~~~~

Второй вариант работает, потому что вы не использовали <> (для явного указания аргументов шаблона).

...