2012-07-24 13 views
13

Tuve un problema hoy usando la palabra clave using en C++11. Decidí usar otro enfoque ahora (agregado como comentarios en el ejemplo a continuación). Puede pensar en X como una matriz, de Y como mixin y el objetivo es acceder al tipo de matriz tranpuestada de X en Y. En lugar de typedef ing X<B,A> en X<A,B>, tomamos otro enfoque que es más poderoso y definimos un alias Sibling que toma dos parámetros de plantilla.C++ 11 `using` palabra clave: especialice el alias de la plantilla del parámetro de la plantilla

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 

he intentado compilar el código anterior con g++-4.7 -std=c++11 -c y me muestra el siguiente mensaje de error:

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 

No entiendo por qué un un mensaje de error en absoluto, o cómo podría solucionarlo. ¿Podría alguien explicarme cuál es el problema?

Gracias mucho!

Respuesta

9

deba caer la typename y utilizar ::template lugar:

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

El identificador a la derecha de :: en este caso (Sibling) no es un tipo, es una plantilla, y por eso esta desambiguador es necesario en lugar de typename.

+3

Esto es incorrecto. También necesita la palabra clave 'typename' aquí, porque' A :: Sibling <...> 'es un nombre de tipo dependiente del ámbito aquí. –

8

Aquí es lo que dice Clang:

<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 
Cuestiones relacionadas