Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;非类型模板参数上的类部分专门化_C++_Templates - Fatal编程技术网

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> {};