2015-05-27 15 views
6

kullanarak genel oluşturma using yönergesini kullanarak, tabanda bildirilen bir iç sınıf şablonunun türetilmiş bir sınıfının public erişim bildirimini getirmeye çalışıyorum. Kod:Özel bir içsel iç şablon, bir yönerge

template <typename T> 
class Base 
{ 
public:  
    template<typename U> 
    struct Inner; 
}; 

template<typename T> 
class Derived: private Base<T> 
{ 
public: 
    using typename Base<T>::template Inner; // make it visible 
    Inner<T>* ptr; // no need for typename here, non-qualified name 
}; 

int main() {} 

Ne gr ++ ne de çınlama ++, adını eleme zaman bir ::template kullanmalıdır böylece hem yaklaşık

error: expected unqualified-id before 'template'

olarak bildiğim kadarıyla, Inner bağımlı şablon adıdır şikayet, bu kodu derlemek ve ayrıca typename, daha önce Base<T>::Inner bağımlı bir türüdür. typename/template ile/olmadan tüm olası kombinasyonları denedim ve hiçbiri derlemedim. Derived'un public bölümünde Inner'u kullanmanın bir yolu var mı?

+0

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#109 –

+0

@ T.Ç. msgstr "" - "ile yazılabilir"? – Barry

+0

@Barry Bu sorunun orijinal örneğinin bir üye işlev şablonu için olduğunu unutmayın. –

cevap

10

Mümkün değil. Bir sınıf şablonu olamaz

using typenameoptnested-name-specifierunqualified-id ;

Fakat niteliksiz-id A kullanılarak beyanı [namespace.udecl] 'den, bir.

sadece yerine bir takma ad yapabiliriz:

template<typename T> 
class Derived: private Base<T> 
{ 
public: 
    template <typename U> 
    using Inner = typename Base<T>::template Inner<U>; 

    Inner<T>* ptr; 
}; 
+0

Teşekkürler! Çalışır, sanırım C++ 98/03 için şansın yok ... – vsoftco

+0

Neden * niteliksiz-kimlik * bir sınıf şablonu olamaz? AFAIK, 'İç ', niteliksiz bir kimliktir ve bir sınıf şablonudır. – vsoftco

+0

@vsoftco Sadece dilbilgisi ile, 'template' anahtar kelimesi için herhangi bir yer yoktur. Baz :: template İç 'ifadesini kullanarak bir * şablon kimliği * olduğu açıkça izin verilmez. Base :: Inner; 'kullanarak yapabilirsiniz, ancak bu aslında size hiç yardımcı olmuyor, bu yüzden ne yaptığından tamamen emin değilim. – Barry