C ++ 11`using`关键字:specialize模板参数的模板别名

时间:2012-07-24 13:28:22

标签: c++ templates c++11 using-directives

我今天使用using中的C++11关键字遇到了问题。我现在决定使用另一种方法(在下面的例子中添加为注释)。您可以将X视为Y作为mixin的矩阵,目的是访问XY的转置矩阵类型。我们采用另一种功能更强大的方法,而不是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

我不明白为什么要收到错误信息或我如何解决它。有人可以向我解释问题是什么吗?

非常感谢!

2 个答案:

答案 0 :(得分:9)

您需要删除typename并改为使用::template

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

在这种情况下,::右侧的标识符(Sibling)不是类型,它是模板,这就是需要使用此消除歧义而不是typename的原因。

答案 1 :(得分:8)

以下是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