[英]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參數外-大概是為了說明,由於簽名必須與專業化匹配,因此該類的模板參數可能需要在專業聲明中重復。
然后,不同之處在於,當T
為int
時,#1是A<T>
的成員的特化—一種寫A<int>
本身的特化的簡寫,與主要模板大體相同。 特別是,為了避免引起誤解,要對專門成員的簽名必須與主模板(實例化)保持不變。 在這種情況下,這意味着它仍然是模板。
在另一方面,#2是恰好是成員的模板的特A<int>
-the專業化是的A<int>::g1
不是“本身, A A<T>::g1
時T
是int
”作為#1。 當然,僅當成員是模板時才適用,這與#3不同。 (在這種情況下,#2是#1聲明的模板的特殊化!)
[temp.expl.spec] / 15的部分要點是,這兩種情況在語法上沒有明顯區別。 區別主要是學術上的:兩者都是針對某些論點的模板實體的外科手術更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.