Следующий код не компилируется с 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, чтобы выполнить замену шаблона. Однако я не понимаю, почему первый код не компилируется. Так кто-нибудь может объяснить мне, почему?