C++ 带模板的类声明

C++ 带模板的类声明,c++,templates,C++,Templates,我有两个以不同方式定义的类,如下所示: template<class T, size_t N = 100> class Stack { T data[N]; }; template<class T = int, size_t N = 100> // Both defaulted class Stack { T data[N]; }; 模板类堆栈{ T数据[N]; }; 模板//都是默认的 类堆栈{ T数据[N]; }; 我想知道这是定义类的两种不同方法,还

我有两个以不同方式定义的类,如下所示:

template<class T, size_t N = 100> class Stack {
  T data[N];
};

template<class T = int, size_t N = 100> // Both defaulted
class Stack {
  T data[N]; 
};
模板类堆栈{
T数据[N];
};
模板//都是默认的
类堆栈{
T数据[N];
};

我想知道这是定义类的两种不同方法,还是它们有不同的含义?

第二个版本有一个默认的模板参数值
int
。换句话说,在创建对象
堆栈
时,不一定需要指定
T

Stack s; // Ok. Internal array will be 'int data[100]'.
Stack<double> s2; // Template parameter overrides default value, i.e. 'double data[100]'.
Stack s;//好啊内部数组将为“int data[100]”。
堆栈s2;//模板参数覆盖默认值,即“双数据[100]”。
在第一个版本中,由于需要指定
t
,因此无法编译上述内容


您的第一个
堆栈
类没有第一个模板参数的默认值:

template<class T, size_t N = 100>
template<class T = int, size_t N = 100>

第二个
堆栈
类的第一个模板参数的默认值为
int

template<class T, size_t N = 100>
template<class T = int, size_t N = 100>

只需删除第一个版本的
模板类堆栈
,第二个版本适用于两种情况:
堆栈
堆栈
都可以。您不需要第一个模板版本,因为第二个版本都有默认值。
堆栈
使用
clang++
给出此错误:
错误:使用类模板“Stack”需要模板参数
您需要空的尖括号(
Stack
)@考えネロク 不需要。不需要。@Snps-非常确定在C++17之前您需要空的尖括号。戈德博尔特同意:@StephenNewell好吧,C++17已经发布,是当前的标准。