繁体   English   中英

属于模板类的成员模板的C ++显式专业化

[英]C++ explicit specialization of member template belonging to template class

在当前的C ++标准草案中, 本段中的这个示例属于与模板的显式专业化相关的部分:

template<class T> struct A {
   void f(T);
   template<class X1> void g1(T, X1);
   template<class X2> void g2(T, X2);
   void h(T) { }
};

// specialization
template<> void A<int>::f(int);

// out of class member template definition
template<class T> template<class X1> void A<T>::g1(T, X1) { }


// member template specialization
template<> template<class X1> void A<int>::g1(int, X1);  //(1)

// member template specialization
template<> template<>
void A<int>::g1(int, char);                              //(2)

在(1)中,似乎g1被专门化为仍然是A的专用版本(A <int>)中的函数模板,而在(2)中,似乎g1本身专门针对其自身的设置模板参数(( int,来自A <int>),char)。

我发现这些专业化之间存在差异(再次,(1)感觉像是声明要用于其“容器” A的“特殊版本”的g1的新版本,而(2)感觉像是关于g1的专业化本身(或关于其自身的模板参数)。

此外,请考虑以下示例:

template<class T> struct A{
   int f() { return 1; }
}

template<>
int A<int>::f() { return 2; }                            //(3)

对我来说(1)和(3)是相同的“一种特殊化”,一种链接到“容器”的特殊版本,而(2)是实体(模板)本身的一种特殊化。

标准中是否提到了这种差异,还是这两种专业化被称为相同?

谢谢。

首先,您的#3等同于引用的示例中的第一个专业化,除了标准的f在其签名中使用类的template参数外-大概是为了说明,由于签名必须与专业化匹配,因此该类的模板参数可能需要在专业声明中重复。

然后,不同之处在于,当Tint时,#1是A<T>成员的特化—一种写A<int>本身的特化的简写,与主要模板大体相同。 特别是,为了避免引起误解,要对专门成员的签名必须与主模板(实例化)保持不变。 在这种情况下,这意味着它仍然是模板。

在另一方面,#2是恰好是成员的模板的特A<int> -the专业化是的A<int>::g1不是“本身, A A<T>::g1Tint ”作为#1。 当然,仅当成员是模板时才适用,这与#3不同。 (在这种情况下,#2是#1声明的模板的特殊化!)

[temp.expl.spec] / 15的部分要点是,这两种情况在语法上没有明显区别。 区别主要是学术上的:两者都是针对某些论点的模板实体的外科手术更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM