14

我今天在使用using关键字 in 时遇到了问题C++11。我决定现在使用另一种方法(在下面的示例中添加为注释)。您可以将其X视为一个矩阵,Y或者一个 mixin,其目的是访问 in 的转置矩阵X类型Y。代替typedefing X<B,A>in 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

我完全不明白为什么会收到错误消息或如何修复它。有人可以向我解释问题是什么吗?

非常感谢!

4

2 回答 2

10

您需要删除typename::template改用:

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

::在这种情况下 ( )右侧的标识符Sibling不是类型,而是模板,这就是为什么需要这个消歧器而不是typename.

于 2012-07-24T13:43:02.033 回答
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 
于 2013-07-14T06:56:37.847 回答