为什么在指定其所有模板参数具有默认值的模板类时需要<>?
Why is <> required when specifying a template class which has defaults for all its template parameters?
当指定具有所有模板参数默认值的模板类时,是否需要<>
?
,例如
#include <iostream>
template<typename T = int>
class C {
public:
T obj = 0;
};
int main()
{
C c1; // Error on almost all compilers (see note below)
C<> c2;
std::cout << c1.obj << " " << c2.obj << std::endl;
return 0;
}
一个示例的缺点是,如果您有一个已经在各个地方使用的类,然后重构它为具有默认参数的类模板,则必须在所有模板参数中添加<>
使用班级的地方。
注意:看起来GCC最新的头(7.0.1)接受没有<>
的语法。较早的版本不会,也没有任何版本的clang。这是最新的海湾合作委员会负责人的错误吗?或者也许C 17的标准现在接受没有<>
的语法,而GCC就在这里?
在C 17中,这是很好的:
C c1{};
由于扣除了类模板。我们将为每个构造函数(和扣除指南)合成一个函数,并执行超载分辨率:
template <class T=int> C<T> foo();
template <class T=int> C<T> foo(C<T> const&);
template <class T=int> C<T> foo(C<T>&&);
第一个是可行的过载,另外两个不是,因此扣除成功,占位符C
被推导的类型C<int>
代替。
然而,从语法上讲,初始化器在[dcl.type.class.deduct]中 ]:
如果推论类类型的占位符在 ext-specifier-seq 的 simple-> simple-declaration 的 dect-specifier 中出现,该声明的 init-declarator 应为形式:
dectarator-id 属性 - seq-seq opt initializer
占位符被替代的函数的返回类型由Orderload分辨率用于类 模板扣除(13.3.1.8)。
,但是显然,在科纳(Kona)取消了这一限制,因此C c;
包含 initializer ,因此语法不合格。这是一个允许此问题的GCC错误。尽管特别禁止这样做似乎很奇怪。C c;
在C 17中确实会得到很好的形式。一旦新措辞出来,我将更新答案。
在C 17之前,该语句仅仅是因为C
不是类型。C
和C<>
不是同一回事。对于拥有所有默认模板参数,并且仍然没有特殊的考虑。类型和类模板是不同的,并且继续对待不同的对待。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中