2015-10-13 42 views
12

A sınıfı:İçiçe sınıf şablonu uzmanlık

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

    Nested<T> n; 
}; 

Ve Nested uzmanlaşmak istiyorum. Denedim İşte Ne:

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; 
}; 

Bir sonraki girişimi:

ben bir çözüm buldum stackoverflow üzerinde İşte
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<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; 
}; 

Mükemmel çalışıyor, ama nasıl anlayamıyorum. Neden kukla şablon argümanı sunmalı? Neden ham uzmanlık alanı template<> class Nested<int, true>{} veya template<> class Nested<int>{} kullanamıyorum?

cevap

12

sınıf kapsamında açık ihtisas oluşturmak yasak:

veren açık uzmanlık uzman şablon kuşatan bir ad beyan edilecektir.

Ama kısmi uzmanlık oluşturmak yasak değil:

A sınıfı şablonu kısmi uzmanlık ilan veya 14.5.1 ve 14.5 tanımı tanımlanabilir her hangi bir isim alanı kapsamında (içinde redeclared edilebilir .2).

bu

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

kısmi uzmanlık ve sınıf kapsamında bu uzmanlık oluşturmak için serbest. Ayrıca, uzman olmayan dış sınıfta iç içe geçmiş sınıfı tam olarak uzmanlaşamazsınız. Bunu yapabilirsiniz:

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

ama bu dış sınıfın içinde özel şablon sınıfın tüm içeriğini tanımlayarak, işe başardı

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

yapamayacağınız. Böylece tüm fonksiyonlar sınıf tanımı ile tamamen tanımlanmıştır. Harici işlev tanımları yok; Yani

template <typename T, size_t N> 
class A 
{ 
private: 
    template <size_t M> 
    class B 
    { 
     ... 
    }; 

    template <> 
    class B<2> 
    { 
     ... 
    }; 
    ... etc 
}; 

En az MS2015 üzerinde çalıştı. Kod iyi çalışıyor.

+1

Evet, ancak gcc ve clang'da çalışmaz. Microsoft, standardı izlemiyor gibi görünüyor. Ya da belki bir derleyici anahtarı vardır. – nikitablack