3

我具有以下的模板:專門只嵌套模板

template<typename FirstParam> 
struct First 
{ 
    template<typename SecondParam> 
    struct Second; 
}; 

例專業化:

template<typename T> class D {}; 

template<> 
template<> 
struct First<C1>::Second<C1::C2> 
{ 
    typedef D<C1::C2> type; 
}; 

這是當這兩個類被專門在同一時間的情況。但是有沒有可能只專攻二班?

是這樣的:

template<typename OuterParam> 
template<> 
struct Outer<OuterParam>::Inner<typename OuterParam::C2> 
{ 
    typedef E<typename OuterParam::C2> type; 
}; 

(是的,我還需要第二PARAM是內部類的第一個。)

回答

4

號§14.7.3[temp.expl.spec]/P16 ,加上強調:

在一個明確的專業化聲明一個類 模板的成員或出現在命名空間內的成員模板時, 成員模板和一些連接的關閉類模板可以保持 非特,只是如果它包含的類模板 沒有明確的專業以及聲明將不會明確 專業類成員模板。

您可以使用 「部分」 專業化,而不是std::is_same

template<typename FirstParam> 
struct First 
{ 
    template<typename SecondParam, bool = std::is_same<typename FirstParam::C2, 
                 SecondParam>::value> 
    struct Second; 

    template<class T> 
    struct Second<T, true> { 
    }; 
};