【发布时间】:2016-06-15 03:12:13
【问题描述】:
这是合法的 C++ 吗?
template <typename T, template <typename T> class>
struct S { };
Clang (3.7.1) 拒绝它,抱怨第二个 T 掩盖了第一个 T。 GCC 似乎并不关心它,我认为这是合理的。我认为模板模板参数中只有参数的数量很重要。
- http://goo.gl/51bHVG (gcc.godbolt.org)
【问题讨论】:
-
为什么要使用
T两次?如果你想在第二个模板中使用T,你可以写template <class T, template <class S=T> class> -
@DavidHaim 这不是强制性的,但是当第一个参数应该提供给作为模板模板的第二个参数时,使用相同(或至少相似)的名称是有意义的对于嵌套模板参数。您的建议很有趣,我从未尝试为模板模板参数指定默认参数。与
template <class T, template <class S> class>相比,它完成了什么? -
我想知道在帖子标题中搜索和销毁标签词的人的驱动动机是什么?他们是否同样热衷于将
NULL替换为nullptr? -
可以与this question相关吗?
-
@DavidHaim 好的,用
template <template T, template <class S=T> class C>,我们可以用C<>替换C<T>,就好像C是用默认模板参数定义的......这可以 在某些情况下很方便,但我不确定我是否会经常使用它。无论如何,非常感谢。
标签: c++ templates language-lawyer template-templates shadowing