【发布时间】:2018-10-23 02:10:36
【问题描述】:
以下代码无法在 Debian Sid 中使用 gcc 6.4 编译,原因是错误:“typename is not allowed”。
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 提供了足够的信息来执行模板替换。但是我不明白为什么第一个代码无法编译。那么有人可以解释一下为什么吗?
【问题讨论】:
标签: c++ templates functional-programming metaprogramming