非类型参数的模板参数必须是表达式

时间:2016-06-17 11:32:43

标签: c++ templates

为什么以下代码有误?

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和一个不模板?

2 个答案:

答案 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是正确类型的constexprsize_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)... Nnon-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