gpt4 book ai didi

c++ - 模板化类型函数中的模板参数

转载 作者:太空狗 更新时间:2023-10-29 21:11:35 29 4
gpt4 key购买 nike

以下代码无法在 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 提供了足够的信息来执行模板替换。但是我不明白为什么第一个代码无法编译。那么有人可以向我解释为什么吗?

最佳答案

您需要使用关键字 template 告诉编译器依赖名称 f (这取决于模板参数 FUNCTION )是一个模板名称。只有当编译器知道这是一个模板名称时,它才会使用 <作为template-argument-list的开头,否则会尝试取<作为小于运算符。

例如

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

第二个有效,因为你没有使用 <> (明确指定模板参数)。

关于c++ - 模板化类型函数中的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50312986/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com