Подтвердить что ты не робот

С++ 11 `using` keyword: специализировать псевдоним шаблона параметра шаблона

Сегодня у меня была проблема с использованием ключевого слова using в C++11. Я решил использовать другой подход сейчас (добавлен в качестве комментариев в примере ниже). Вы можете представить X в качестве матрицы, Y как mixin, и целью является доступ к матричному типу tranposed X в Y. Вместо typedef ing 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

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

Спасибо, много!

4b9b3361

Ответ 1

Вам нужно отбросить typename и вместо этого использовать ::template:

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

Идентификатор справа от :: в этом случае (Sibling) не является типом, он является шаблоном и поэтому нужен этот дизаммигатор вместо typename.

Ответ 2

Вот что говорит Кланг:

<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