2013-03-15 26 views
14

için bildirimini kullanarak (ya da genellikle bir şablon parametresi bir temel sınıf şablon bağımsız değişken olarak geçirildiğinde) bir using bildiriminde tabanın elemanı şablonları isim imkansızdır?, cRTP bir şablon içinde kullanıldığı zaman, tür bağımlı şablon adı

template< typename d > 
struct base { 
    template<typename> 
    struct ct {}; 

    template<typename> 
    void ft() {} 
}; 

template< typename x > 
struct derived : base< derived<x> > { 
    using derived::base::template ct; // doesn't work 
    using derived::base::ft; // works but can't be used in a template-id 
}; 

kullanarak-beyan dilbilgisi üretimi nitelikli-id içermemektedir, çünkü dilde bir delik geliyor bana. Tek kural using-declaration: using typename(opt) qualified-id olsaydı

using-declaration: 
    using typename(opt) nested-name-specifier unqualified-id ; // have this 
    using :: unqualified-id ; 

unqualified-id: 
    identifier 
    operator-function-id 
    conversion-function-id 
    literal-operator-id 
    ~ class-name 
    ~ decltype-specifier 
    template-id 

qualified-id: 
    nested-name-specifier template(opt) unqualified-id // want this 
    :: identifier 
    :: operator-function-id 
    :: literal-operator-id 
    :: template-id 

, sadece sonuçları zaten açıkça yasakladığı :: template-id izin :: conversion-function-id, :: ~ class-name ve :: ~ decltype-specifier template-id hiçbir anlamsal mantıklı

  • dışarı iktidar

    • olurdu 7.3.3/5 ve
    • önce deliğe yama için yeterli özelliğe sahiptir template anahtar kelimeyi sağlanır.

  • bu analiz doğru mu?

    Yeni dilbilgisine izin verildiği göz önüne alındığında, typename numaralı bir bildirimin, bir sınıf şablonu veya diğer ad şablonu alması ve typename olmadan bir geçerli işlev için bir işlev veya değişken şablonu alması gerekir.

     using typename derived::base::template ct; 
        using derived::base::ft; 
    

    Bu

    bazı ek şartname gerektirebilir. Ayrıca, mevcut statükonun bağımlı şablon adları her zaman belirsiz tür (değil şablon kimlikleri) sahip olduğu görülmektedir, nedenle typename hiç ct ile ait olduğu belli değil. C++ 11 ile ince

    +0

    İlginç bir analiz. Nerede * kullanacağınızı merak ediyorum * bu şekilde tanımlanmış "delik" in önleyici olacağı bir şekilde. Yani Bu programın mimarisini tekrar gözden geçirip yeniden gözden geçirmeniz gereken bir engel oluşturan gerçek dünya uygulaması nedir? – WhozCraig

    +0

    @WhozCraig Bu, şablondan CRTP'yi kullandığınız her zaman gelir. Temel sınıf, her kullanımda 'this -> * template' veya' base :: template 'demek zorunda olduğunuz bir arabirim sağlar. – Potatoswatter

    +0

    Tamam, sanırım anladım. Bu özel durum, hayatı kolaylaştırmak için bir 'using' cümlesiyle kullanılması ile ilgilidir, ancak izin verilmiyor gibi görünmektedir. İyi örnek. Teşekkür ederim. – WhozCraig

    cevap

    2

    aşağıdaki çalışır:

    #include <iostream> 
    
    template< typename d > 
    struct base { 
        template<typename> 
        struct ct {}; 
    
        template<typename> 
        void ft() {std::cerr << "cheesecake" << std::endl;} 
    }; 
    
    template< typename x > 
    struct derived : base< derived<x> > { 
        template<typename X> 
        using ct = typename derived::base::template ct<X>; // new in C++11 
        using derived::base::ft; 
    }; 
    
    int main() 
    { 
        derived<int>::ct<float> c; 
        derived<int> a; 
        a.ft<int>(); 
    } 
    

    o size ct ve ft kullanmak isteyeyim nasıl bir örnek verir misiniz, ne istediğini değilse?

    +1

    Evet, şablon takma adı işe yarayacaktır, ancak bu, bazılarının endişelerini ayrıştıran şablon imzasını yeniden beyan etmeyi gerektiriyor. "Using" bildirimi işlevi "türetilmiş" kapsamı içinde çalışmaz. Mükemmel yönlendirme işe yarayacaktı. Ama bunlar beyanları kullanmıyor. Eklenen ayak çalışması, bir şeyi yeni bir bildirimde bulunmadan * bir kapsamdan ilgili bir ada sahip birine * gönderecek olan “kullanma” beyanının amacını yitirir. Her neyse… mükemmel nakliyeyi ekleyin ve bunu kabul etmeliyim. – Potatoswatter

    İlgili konular