C ++类对非类型模板参数的部分特化

时间:2017-01-10 16:54:36

标签: c++ templates

我不确定我的术语是否正确,但我认为我有一个带有类型和非类型模板参数的类模板,我想部分专注于非类型参数:

template<class T, int I> struct A
{
    void f();
};

template<class T> void A<T, 1>::f() {}

int main()
{
    A<int, 1> a1;
    a1.f();
}

使用Visual C ++,我得到error C3860: template argument list following class template name must list parameters in the order used in template parameter listerror C2976: 'A<T,I>': too few template arguments

但是如果我删除了type参数,那么我似乎可以专注于非类型参数:

template<int I> struct B
{
    void g();
};

void B<1>::g() {}

int main()
{
    B<1> b1;
    b1.g();
}

所以我想要的是不可能的,或者我只是没有以正确的方式做到这一点?如果不可能,还有替代方案吗?

1 个答案:

答案 0 :(得分:2)

让我们考虑standard(工作草案)所说的内容:

  

类模板的成员[...]可以显式专门用于类模板的给定隐式实例化,即使在类模板定义中定义了成员[...]。使用显式特化的语法指定成员[...]的显式特化。

换句话说,不允许您尝试做的事情 就是这样。

想象一下,如果是这样的话,那么你也可以允许这样做:

template<class T, int>
struct A { void f(); };

template<typename T>
void A<T, 1>::f() {}

template<>
struct A<int, 1> {};

也就是说,为类模板定义f,其特殊化甚至无法声明f
它没有多大意义,是吗?

另一方面,请考虑以下成员专业化:

template<>
void A<int, 1>::f() {}

它导致A<int, 1>的实例化无法进一步专业化 换句话说,在这种情况下你不能这样做:

template<>
struct A<int, 1> {};

f的存在在某种程度上是保证因此。