C++11 `с использованием ключевого слова `:специализации псевдонима шаблона параметра шаблона

Сегодня у меня возникла проблема с использованием ключевого слова usingв C++11. Я решил использовать другой подход, теперь (добавлен в качестве комментариев в примере ниже ). Вы можете думать о Xкак о матрице, о Yкак о миксине, и цель состоит в том, чтобы получить доступ к транспонированному матричному типу Xв Y. Вместо того, чтобы typedefиспользовать X<B,A>в X<A,B>, мы используем другой подход, более мощный, и определяем псевдоним Sibling, который сам принимает два параметра шаблона.

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

Я попытался скомпилировать приведенный выше код с g++-4.7 -std=c++11 -c, и он показывает следующее сообщение об ошибке:

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

Я не понимаю, почему я вообще получаю сообщение об ошибке или как я могу это исправить. Может ли кто-нибудь объяснить мне, в чем проблема?

Большое спасибо!

13
задан Markus Mayr 12 August 2014 в 13:05
поделиться