C++ C++;非类型模板参数上的类部分专门化
我不确定我的术语是否正确,但我认为我有一个同时具有类型和非类型模板参数的类模板,我想仅对非类型参数进行部分专门化:C++ C++;非类型模板参数上的类部分专门化,c++,templates,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(); } 那么,我想要的是不可能的,还是我做得不对?如果不可能,还
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();
}
那么,我想要的是不可能的,还是我做得不对?如果不可能,还有别的选择吗? 让我们考虑一下(工作草案)所说的:
类模板的成员[…]可以显式专用于类模板的给定隐式实例化,即使该成员[…]是在类模板定义中定义的。使用显式专门化的语法指定成员[…]的显式专门化 换句话说,您试图做的是不允许的。就这些
想象一下,如果是这样的话,你也会被允许这样做:
template<class T, int>
struct A { void f(); };
template<typename T>
void A<T, 1>::f() {}
template<>
struct A<int, 1> {};
它导致无法进一步专门化的A
实例化。换句话说,在这种情况下,您不能这样做:
template<>
struct A<int, 1> {};
模板
结构A{};
因此,
f
的存在在某种程度上得到了保证。参见。模板参数不是一个类型这一事实是一个误导。第二个例子之所以有效,是因为它是一个完全专业化的例子。这个例子的可能重复是有意义的。我回避了整个类的部分专门化,因为需要重复这么多代码(实际上它是一个大类)。但我知道现在它必须这样工作。
template<>
void A<int, 1>::f() {}
template<>
struct A<int, 1> {};