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