2015-05-27 10 views
6

Próbuję użyć dyrektywy using, aby wprowadzić deklarację dostępu klasy pochodnej o nazwie public w wewnętrznym szablonie klasy deklarowanym w bazie. Kod:Tworzenie prywatnego dziedziczonego szablonu wewnętrznego za pomocą dyrektywy używającej

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() {} 

Ani g ++ ani brzęk ++ skompilować ten kod, zarówno narzekają

error: expected unqualified-id before 'template'

O ile mi wiadomo, Inner jest zależne nazwa szablonu, więc należy używać ::template badając jego nazwę, a także typename wcześniej, ponieważ Base<T>::Inner jest typem zależnym. Próbowałem wszystkich możliwych kombinacji z/bez typename/template i nie kompilowałem. Czy istnieje sposób użycia Inner w sekcji public z Derived?

+0

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

+0

@ T.C.. "można zapisać za pomocą' -> szablonu' "? – Barry

+0

@Barry Należy zauważyć, że oryginalny przykład w tym wydaniu dotyczył szablonu funkcji członka. –

Odpowiedz

10

Niemożliwe. użyciu deklaracja jest od [namespace.udecl]:

using typenameoptnested-name-specifierunqualified-id ;

Ale niewykwalifikowanego-id nie może być szablon klasy.

Można po prostu zrobić alias Zamiast:

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

    Inner<T>* ptr; 
}; 
+0

Dzięki! Działa, przypuszczam, że dla C++ 98/03 nie masz szczęścia ... – vsoftco

+0

Dlaczego szablon * niewykwalifikowany * może być szablonem klasy? AFAIK, 'Inner ' jest niekwalifikowanym identyfikatorem i jest szablonem klasy. – vsoftco

+0

@vsoftco Po prostu przez gramatykę, nie ma żadnego odniesienia do słowa kluczowego "szablon" w dowolnym miejscu. 'using Base :: template Inner ' jest jawnie niedozwolone, ponieważ jest to * identyfikator szablonu *. Możesz zrobić "używając Base :: Inner;', ale to w rzeczywistości nie pomaga, więc nie jestem do końca pewien co robi. – Barry

Powiązane problemy