Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 非类型参数的模板参数必须是表达式_C++_Templates - Fatal编程技术网

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;