【问题标题】:template parameters in templated type function模板化类型函数中的模板参数
【发布时间】: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


    【解决方案1】:

    你需要使用关键字template告诉编译器依赖名称f(它依赖于模板参数FUNCTION)是一个模板名称。只有当编译器知道这是一个模板名称时,它才会将&lt; 作为模板参数列表的开头,否则它会尝试将&lt; 作为小于运算符。

    例如

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

    第二个有效,因为您没有使用&lt;&gt;(明确指定模板参数)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 2011-07-26
      相关资源
      最近更新 更多