2016-04-13 39 views
1

Dış sınıfın şablon parametreleri olduğunda iç içe geçmiş bir sınıf için satır içi kurucu sağlamaya çalışırken zamanın bir anını yaşıyorum. Büküm, iç sınıf sadece veri üye beyanları ile farklıdır. Aşağıda benim MCVE. Daha az olabilseydi özür dilerim. Yukarıdan Dış sınıf tempold edildiğinde iç içe geçmiş sınıf için satır içi kurucu

typedef unsigned char byte; 

template<class W, bool B> 
struct F 
{ 
    struct G; 
}; 

template class F<int, false>; 
template class F<long, true>; 

template<> 
struct F<int, false>::G 
{ 
    G(); 
    byte b[4]; 
}; 

template<> 
struct F<long, true>::G 
{ 
    G(); 
    byte b[6]; 
}; 

template<> 
F<int, false>::G::G() 
{ 
    b[0] = b[1] = b[2] = b[3] = 0; 
} 

template<> 
F<long, true>::G::G() 
{ 
    b[0] = b[1] = b[2] = b[3] = b[4] = b[5] = 0; 
} 

int main(int argc, char* argv[]) 
{ 
    return 0; 
} 

, ben sadece çizgi dışına olmak F::G::G istiyorum.

bunu derlemek girişiminde, bu sonuçlanır:

test.cxx:29:1: error: template-id ‘G<>’ for ‘F<int, false>::G::G()’ does not match any template declaration 
F<int, false>::G::G() 
^ 
test.cxx:35:1: error: template-id ‘G<>’ for ‘F<long int, true>::G::G()’ does not match any template declaration 
F<long, true>::G::G() 
^ 

nasıl G için bir out-of-line yapıcısı sağlar?


İşlevlere odaklanan başka benzer sorular var. Bağlantı kopukluğum, veri üyesi ağrıyan nokta olduğunda bunu çalışıyor gibi görünüyor. How to explicitly instantiate a template class that has a nested class with a friend function


  • İşte yapmak çalışıyorum budur. C++ bu kadar kolay olmasına izin vermez, bu yüzden derleme zamanı bildirimlerini almak için şablon uzmanlıklarına başvurmak zorunda kaldım.

    template<class W, bool B> 
    struct F 
    { 
        struct G 
        { 
        #if (B == true) 
         byte b[6]; 
        #else 
         byte b[4]; 
        #endif 
        }; 
    }; 
    
  • +1

    'G' kurucuları [benim için çalışır] (http://ideone.com/u65mFa). –

    cevap

    1

    G, bir şablon sınıfının iç sınıfı olsa da, aslında bir şablon sınıfı değildir.

    Bu çalışacaktır: tabii

    F<int, false>::G::G() 
    { 
        b[0] = b[1] = b[2] = b[3] = 0; 
    } 
    
    F<long, true>::G::G() 
    { 
        b[0] = b[1] = b[2] = b[3] = b[4] = b[5] = 0; 
    } 
    

    bu durumda, kendini kurtarabilecek yapıcıları için endişelenmek zahmet: tanımlarından `şablon <>` Çıkarma

    template<> 
    struct F<int, false>::G 
    { 
        byte b[4] = { 0 }; // zero - initialised 
    }; 
    
    template<> 
    struct F<long, true>::G 
    { 
        byte b[6] = { 0 }; // zero - initialised 
    }; 
    
    +0

    Çok teşekkür ederim. Aslında diğer yöne gittim - “G” şablonunu denemeye çalışıyorum ve C++ silliness “template <> template <> ...” gibi. Ne kadar zaman harcadığımı çığlık atabilirdim ... – jww

    +0

    Her şeyimiz bitti ... –