簡體   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