为什么以下代码有误?
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和一个不模板?
答案 0 :(得分:3)
您无法将Dynamic
用于专业化Vector
,因为Dynamic
是类,而您的主要模板需要int
。你想要的可能是:
#include <limits>
constexpr size_t Dynamic = std::numeric_limits<size_t>::max();
template <typename T, size_t N>
struct Vector {
T data[N];
};
template <typename T>
struct Vector<T, Dynamic> {
T* data;
};
Vector<int, 10> static_array;
Vector<int, Dynamic> dynamic_array;
此处Dynamic
是正确类型的constexpr
(size_t
),因此您可以专门化模板。您将无法创建大小为std::numeric_limits<size_t>::max()
的静态数组(这应该不是问题)。
答案 1 :(得分:2)
template <typename T, int N>
struct Vector {
T data[N];
};
在您的主要模板类中,T
必须是type,(int, short, class-type, etc
)... N
是non-type,必须是表达式,其值为int
类型(数字)。
struct Dynamic {
};
template <typename T>
struct Vector<T, Dynamic> {
T* data;
};
Dynamic
是一种类型。不是主模板中指定的int
根据您的主要模板类,您只能使用Vector
专门化int
的第二个模板参数。例如
template <typename T>
struct Vector<T, 1> {
T* data;
};
template <typename T>
struct Vector<T, 35> {
T* data;
};
template <typename T>
struct Vector<T, constExpressionThatReturnsAnInt> {
T* data;
};
...etc