2016-11-15 47 views
4

模板特考慮下面的代碼:的內部類

struct X 
{ 
    template <typename T> 
    class Y 
    {}; 
}; 
template<> 
class X::Y<double>{ 
}; 

在這裏,我們是專業的類型的Y艙雙和代碼工作正常。問題是,如果我的代碼改成這樣:

template<typename A> 
struct X 
{ 
    template <typename T> 
    class Y 
    {}; 
}; 
template<typename A> 
class X<A>::Y<double>{ 
}; 

編譯器會報告錯誤:

'X::Y': explicit specialization is using partial specialization syntax, use template <> instead!

劑量任何一個知道我可以專注Y類在這種情況下?

+0

請問做什麼錯誤消息說沒有幫助?使用'template <>'而不是'template '嵌套模板專門化。 –

+0

它不工作!我也厭倦了這一點: template <> class X :: Y { }; – MEMS

回答

2

簡單的答案 - 你不能完全專門化模板化的內部類的模板外部類。但如果你真的想達到類似的效果,你可以嘗試用虛擬的缺省模板參數偏特:

#include <iostream> 

template<typename A> 
struct X 
{ 
    template <typename T, T* =nullptr> 
    class Y{}; 
}; 

template<typename A> 
template<double *Ptr> 
class X<A>::Y<double, Ptr> { 
public: 
    static constexpr int value = 1; 
}; 

int main() { 
    std::cout << X<int>::Y<double>::value << std::endl; 
} 

[live demo]

+1

書:經典的C++高級元編程,第33頁說: 模板專業化是有效的僅在命名空間級別: 結構X { 模板 Y類 {}; template <> //非法,但通常被編譯器容忍 class Y {}; }; template <> // legal class X :: Y { }; 所以你做了什麼可能會工作,但並不總是! – MEMS

+0

@MEMS您的作者可能是對的。在查找標準示例後,我意識到我可能實際上是在解釋'[temp.class.spec]/5'。根據C++標準核心語言活動問題'更新代碼 –

+1

@MEMS'727。成員類的內聯顯式專業化內聯部分專業化很好地形成......所以我以前的代碼確實是有效的。請查找[參考](http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#727) –

3

你不能專門化內部模板類而不明確地專門化外部模板類。 See this question for more details and a quote from the standard.

解決方法:創建一個外部類,在一個具體的命名空間既需要TA和別名它裏面X

namespace impl 
{ 
    template <typename A, typename T> 
    struct Y { }; 
} 

template<typename A> 
struct X 
{ 
    template <typename T> 
    using Y = impl::Y<A, T>; 
}; 

如果你是罰款明確專攻內部和外部類,可以使用以下語法:

template <> 
template <> 
class X<int>::Y<double> 
{ 
    // ... 
}; 

Example on wandbox

+0

如果我想將它專門化爲特定的X和Y,請執行以下操作: template <> class X :: Y { }; 在這種情況下它也抱怨!它說:錯誤C2992:'X :: Y ':無效或缺少模板參數列表 – MEMS

+0

@MEMS:您需要雙'template <>'。 [wandbox示例](http://melpon.org/wandbox/permlink/5QsXzayEWYB8Vz1E)。 –

+0

也更新了我的答案。 –