我不确定我的术语是否正确,但我认为我有一个带有类型和非类型模板参数的类模板,我想部分专注于非类型参数:
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 list
和error 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();
}
所以我想要的是不可能的,或者我只是没有以正确的方式做到这一点?如果不可能,还有替代方案吗?
答案 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
的存在在某种程度上是保证因此。