【发布时间】:2016-06-17 11:32:42
【问题描述】:
为什么下面的代码错了?
template <typename T, int N>
struct Vector {
T data[N];
};
struct Dynamic {
};
template <typename T>
struct Vector<T, Dynamic> {
T* data;
};
我尝试使用Vector<int, Dynamic> obj; 实例化代码,但没有成功
错误:非类型模板参数的模板参数必须是表达式
为什么?我正在传递一个类型,我认为这是一个有效的模板特化。
如果标有Dynamic,我如何使用两个模板,一个请求 N,一个不请求 N?
【问题讨论】:
-
主模板需要
int,但您在专业化中提供了Dynamic,所以这是无效的。 -
错误信息没有准确地说明问题所在吗?
Dynamic不是表达式,而是类型名称。这不是int的值。 -
@KerrekSB 好的,但是为什么 this 不工作呢?这是另一个模板,完全不相关
-
@Dean 这两个模板并非不相关,因为第二个模板是第一个模板的特化。
-
@Dean:同样的问题。别介意部分特化定义了一个新模板,但是您试图根据一个没有意义的模板实例化来定义它。