C++11 'using' 关键字:专用模板参数的模板别名

C++11 `using` keyword: specialize template alias of template parameter

提问人:Markus Mayr 提问时间:7/24/2012 最后编辑:Markus Mayr 更新时间:8/12/2014 访问量:11941

问:

我今天在使用 .我现在决定使用另一种方法(在下面的示例中添加为注释)。你可以把它看作是一个矩阵,也可以看作是一个混合体,目的是访问转置的矩阵类型。我们没有 ing in ,而是采用另一种更强大的方法,并定义一个本身接受两个模板参数的别名。usingC++11XYXYtypedefX<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

我不明白为什么会收到错误消息,或者我该如何解决它。有人可以向我解释一下问题是什么吗?

多谢!

C++ 模板 C++11 using 指令

评论


答:

12赞 R. Martinho Fernandes 7/24/2012 #1

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

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

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

评论

3赞 Richard Smith 7/14/2013
这是不正确的。此处还需要关键字,因为此处是依赖作用域的类型名称。typenameA::Sibling<...>
10赞 Richard Smith 7/14/2013 #2

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 

评论

0赞 underscore_d 5/5/2023
Flippin' GCC 及其 flippin' 错误...哈哈