C++ 非类型参数的模板参数必须是表达式
为什么下面的代码是错误的C++ 非类型参数的模板参数必须是表达式,c++,templates,C++,Templates,为什么下面的代码是错误的 template <typename T, int N> struct Vector { T data[N]; }; struct Dynamic { }; template <typename T> struct Vector<T, Dynamic> { T* data; }; 模板 结构向量{ T数据[N]; }; 结构动态{ }; 模板 结构向量{ T*数据; }; 我试图用Vector obj实例化代码
template <typename T, int N>
struct Vector {
T data[N];
};
struct Dynamic {
};
template <typename T>
struct Vector<T, Dynamic> {
T* data;
};
模板
结构向量{
T数据[N];
};
结构动态{
};
模板
结构向量{
T*数据;
};
我试图用Vector obj实例化代码代码>但它不起作用
错误:非类型模板参数的模板参数必须是表达式
为什么??我正在传递一个类型,我认为这是一个有效的模板专门化
如果标记为动态
,如何使用两个模板,一个请求N,另一个不请求N
template <typename T, int N>
struct Vector {
T data[N];
};
Dynamic
是一种类型。不是主模板中指定的int
根据主模板类,只能使用int
专门化Vector
的第二个模板参数。例如
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
模板
结构向量{
T*数据;
};
模板
结构向量{
T*数据;
};
模板
结构向量{
T*数据;
};
等
您不能使用动态
专门化向量
,因为动态
是一个类,您的主模板需要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;
#包括
constexpr size_t Dynamic=std::numeric_limits::max();
模板
结构向量{
T数据[N];
};
模板
结构向量{
T*数据;
};
矢量静态阵列;
矢量动态阵列;
这里的Dynamic
是一个类型正确的constepr
(size\t
),因此您可以专门化模板。您将无法创建大小为std::numeric_limits::max()
(这不应该是问题)。主模板需要int
,但您在专业化中提供了动态
,因此这是无效的。错误消息没有确切说明问题所在吗<代码>动态
不是表达式,而是类型名称。这不是int
@KerrekSB的值好吧,但为什么不起作用呢?这完全是另一个模板unrelated@Dean这两个模板并不是不相关的,因为第二个模板是第一个模板的特化。尽管部分专门化定义了一个新模板,但您试图用一个毫无意义的模板实例化来定义它。
#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;