gpt4 book ai didi

c++ - 方法头部的模板化模板参数名称无效

转载 作者:行者123 更新时间:2023-11-27 23:36:30 25 4
gpt4 key购买 nike

我有以下示例代码:

template<int Size, template<typename Tin, int S> typename Cin, template<typename Tout, int S> typename Cout>
Cout<Tout, Size> SomeTemplatedMethod(const Cin<Tin, Size> &inputData) /* Here the definition fails on Tout and Tin as unknown. */
{
Cout<Tout, Size> result; // Here Tout doesnt fail!
//Whichever we do with inputData and result
return result;
}

代码在方法头中失败,但在方法体中没有!我发现解决这个问题的一种方法是这样做:

template<int Size, template<typename, int> typename Cin, template<typename, int> typename Cout, typename Tin, typename Tout>
Cout<Tout, Size> SomeTemplatedMethod(const Cin<Tin, Size> &inputData) /* Here the definition doesn't fail. */
{
Cout<Tout, Size> result; // Here Tout doesnt fail!
//Whichever we do with inputData and result
return result;
}

但我绝对愿意使用第一种方式,因为它感觉更干净...

我正在使用 vc++14。我做错了什么?这是错误还是预期的行为?

谢谢!

最佳答案

这是预期的行为。

来自 [basic.scope.el]/1 :

The declarative region of the name of a template parameter of a template template-parameter is the smallest template-parameter-list in which the name was introduced.

并且,来自 [basic.scope.el]/3 :

The potential scope of a template parameter name begins at its point of declaration and ends at the end of its declarative region.

因此,声明区域例如Tin在上面的第一个示例中,它是在 template-parameter-list 中引入的,其范围的末尾是该模板参数列表的末尾。你可以例如使用 Tin作为template< template< typename Tin, Tin arg> class Cin, ... , 但你不能使用 Tin声明一个超出其范围的名称。

最后,请注意对于 C++14 及更早版本,template<...> typename TT>是不合法的,因为模板模板参数声明只能使用class关键字而不是 typename (对于 C++14,您的示例也应该失败)。除非编译器扩展,在 C++14 中你需要使用 template<...> class TT> .引用 cppreference/template_parameters :

Unlike type template parameter declaration, template template parameter declaration can only use the keyword class and not typename. (until C++17)

关于c++ - 方法头部的模板化模板参数名称无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58854275/

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