2017-02-06 5 views
3

Ich versuche eine Template-Klasse zu instanziieren, die in einer Klasse enthalten ist, die als Template-Parameter angegeben wird. Dies könnte einfacher sein, mit einem Beispiel zu verstehen:Deklarieren von Variablen in einer Klasse mit Template-Klasse Geben Sie den Template-Parameter ein

struct A { 
static constexpr int a = 42; 

class B { 
    int b; 
}; 

template<typename X> 
class C { 
    X c; 
}; 
}; 

template<typename U, typename T> 
class D { 
    int a = U::a; 

    using B = typename U::B; 
    B b; 

    //using C = typename U::C; 
    // C<T> c; 
    A::C<T> e; 
}; 


int main(void) { 
    D<A, int> d; 
    return 0; 
} 

Wenn ich die kommentierten Zeilen Kommentar-, die Compiler mir einen Fehler gibt, die sagen C nicht eine Vorlage. Ich habe andere Ansätze versucht, diese Variable zu instanziieren, aber es hat nicht funktioniert. Ich hätte gerne das Äquivalent der e-Variablen, aber benutze den U-Typnamen.

Antwort

5

Hinweis: Sie haben C nicht als Schablonentyp deklariert, dann verursacht C<T> c den Fehler, weil Sie ihn nicht als Schablonentyp verwenden können.

Was Sie wollen, ist alias template (ein Name für eine Familie von Typen), die korrekte Syntax ist:

template <typename Z> 
using C = typename U::template C<Z>; 

dann

C<T> c; // same as U::template C<T>; Z is substituted with T 

Mit D<A, int> d;, U = A und T = int, dann C<T> innerhalb ist das gleiche wie A::C<int>.

LIVE

+0

hatte ich das schon versucht, und ich diesen Fehler bekommen hatte: Fehler: erwartet ‚‘ vor ‚<‘ token mit C = Typnamen U :: C Dam

+0

@Dam Was Compiler? Ich habe eine Demo [hier] (http://rexttester.com/YIOAX7967) versucht. – songyuanyao

+0

Nein, es ist jetzt in Ordnung. Vielen Dank :) – Dam

Verwandte Themen