2015-10-13 20 views
12

クラス:入れ子になったクラステンプレートの特殊

template<typename C, typename T> 
class A 
{ 
    template <typename U> 
    class Nested{}; 

    Nested<T> n; 
}; 

そして私はNestedを専門としたいです。ここで私が試した何:

template<typename C, typename T> 
class A 
{ 
    template <typename U> 
    class Nested{}; 

    template <> 
    class Nested<int>{}; // by my logic this should work by I have a compilation error "explicit specialization in non-namespace scope 'class A<C, T>'" 

    Nested<T> n; 
}; 

私の次の試み:それは完璧に動作

template<typename C, typename T> 
class A 
{ 
    template <typename U, bool Dummy = true> 
    class Nested{}; // why need of this Dummy?? 

    template <bool Dummy> 
    class Nested<int, Dummy>{}; // why need to provide an argument?? 

    Nested<T> n; 
}; 

が、私はどのように理解することはできません:StackOverflowの上ここで

template<typename C, typename T> 
class A 
{ 
    template <typename U> 
    class Nested{}; 

    Nested<T> n; 
}; 

template<> 
A<>::Nested<int>{}; // What is the correct syntax to do it here? Now I have an error "wrong number of template arguments (0, should be 2)" 

を私が解決策を見つけました。なぜダミーのテンプレート引数を提供するのですか?生の専門化template<> class Nested<int, true>{}またはtemplate<> class Nested<int>{}を使用できないのはなぜですか?

答えて

12

クラススコープに明示的な特殊化を作成することは禁じられています:

明示的な特殊は 特化したテンプレートを囲む名前空間で宣言されなければなりません。

しかし、部分的な特殊化を作成することは禁じられていない:

クラステンプレート部分的な特殊化を宣言またはその定義は、(14.5.1 および14.5に定義することができる、任意の名前空間スコープで を再宣言することができます2)。

この

template <bool Dummy> 
class Nested<int, Dummy>{}; // why need to provide an argument?? 

部分特殊であり、クラススコープで、このような特殊化を作成することができます。また、特殊な外部クラスでは、ネストされたクラスを完全に特殊化することはできません。あなたはこれを行うことができます。

template<> 
template<> 
class A<int, double>::Nested<int> 
{ 
}; 

が、私は、これは外部クラス内の特殊なテンプレートクラスのすべての内容を定義することによって、仕事を得ることに成功し

template<typename C, typename T> 
template<> 
class A<C, T>::Nested<int> 
{ 
}; 
1

あなたが行うことはできません。したがって、すべての関数はクラス定義で完全に定義されています。外部関数定義はそれほど複雑ではないようです。私。

少なくともMS2015で動作します。コードは正常に動作しています。

+1

はい、gccとclangでは実行されません。マイクロソフト社のような、標準に準拠していないもの。あるいは、コンパイラスイッチがあります。 – nikitablack

関連する問題