2012-07-24 9 views
13

Ich hatte ein Problem heute mit dem using Schlüsselwort in C++11. Ich entschied mich, jetzt einen anderen Ansatz zu verwenden (hinzugefügt als Kommentare im folgenden Beispiel). Man kann sich X als eine Matrix vorstellen, von Y als ein Mixin und das Ziel ist es, auf den durchgesetzten Matrixtyp von X in Y zuzugreifen. Anstelle von typedef in X<B,A> in X<A,B> nehmen wir einen anderen Ansatz, der leistungsfähiger ist und einen Sibling Alias ​​definiert, der selbst zwei Template-Parameter akzeptiert.C++ 11 `using` Schlüsselwort: spezialisieren Vorlage Alias ​​von Vorlage Parameter

template <class A, class B> 
struct X 
{ 
    using Left = A; 
    using Right = B; 
    template <class T1, class T2> 
    using Sibling = X<T1, T2>; 
    // using Reversed = X<B, A>; // What I really want and use now. :-) 
}; 

template <class A> 
struct Y 
{ 
    using Left = typename A::Left; 
    using Right = typename A::Right; 
    using AReverse = typename A::Sibling<Right, Left>; // Gives a compiler error 
    // using AReverse2 = typename A::Reversed; // Works, of course. 
}; 

using Z = X<int,double>::Sibling<double,int>; // Works 

Ich habe versucht, den Code oben mit g++-4.7 -std=c++11 -c Kompilieren und es zeigt mir die folgende Fehlermeldung:

t.cpp:16:9: error: expected nested-name-specifier before ‘AReverse’ 
t.cpp:16:9: error: using-declaration for non-member at class scope 
t.cpp:16:18: error: expected ‘;’ before ‘=’ token 
t.cpp:16:18: error: expected unqualified-id before ‘=’ token 

Ich verstehe nicht, warum ein eine Fehlermeldung überhaupt erhalten oder, wie ich es beheben könnte. Könnte mir jemand erklären, was das Problem ist?

Vielen Dank!

Antwort

9

Sie benötigen die typename und verwenden ::template statt fallen:

using AReverse = A::template Sibling<Right, Left>; 

Die Kennung rechts von :: in diesem Fall (Sibling) kein Typ ist, es eine Schablone ist, und das ist, warum diese Eindeutigkeitsfinder ist benötigt statt typename.

+3

Dies ist falsch. Außerdem benötigen Sie hier das Schlüsselwort 'typename', da' A :: Sibling <...> 'hier ein abhängiger Typ ist. –

8

Hier ist, was Clang sagt:

<stdin>:16:32: error: use 'template' keyword to treat 'Sibling' as a dependent template name 
    using AReverse = typename A::Sibling<Right, Left>; // Gives a compiler error 
          ^
           template