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ı
- olurdu 7.3.3/5 ve
- önce deliğe yama için yeterli özelliğe sahiptir
template
anahtar kelimeyi sağlanır.
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, nedenletypename
hiç
ct
ile ait olduğu belli değil. C++ 11 ile ince
İ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
@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
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