我不确定我的术语是否正确,但我认为我有一个包含类型和非类型模板参数的类模板,并且我想部分专门研究非类型参数:
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
and error C2976: 'A<T,I>': too few template arguments
.
但是,如果我删除类型参数,那么我似乎可以专注于非类型参数:
template<int I> struct B
{
void g();
};
void B<1>::g() {}
int main()
{
B<1> b1;
b1.g();
}
那么是我想要的不可能,还是我只是没有以正确的方式做?如果不可能,有其他选择吗?
让我们考虑一下standard http://eel.is/c++draft/temp.spec#temp.expl.spec-14(工作草案)说:
类模板的成员可以显式地专门用于类模板的给定隐式实例化,即使该成员是在类模板定义中定义的。成员 [...] 的显式特化是使用显式特化语法来指定的。
换句话说,你试图做的事情是不被允许的。
就这样。
想象一下,如果是的话,你也可以这样做:
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
不知何故保证 thus.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)