首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11 `using`关键字:专门化模板参数的模板别名

C++11 `using`关键字:专门化模板参数的模板别名
EN

Stack Overflow用户
提问于 2012-07-24 21:28:22
回答 2查看 9.8K关注 0票数 14

我今天在C++11中使用using关键字时遇到了一个问题。我决定现在使用另一种方法(在下面的示例中添加为注释)。您可以将X看作一个矩阵,将Y看作一个mixin,其目的是在Y中访问X的变换矩阵类型。我们没有在X<A,B>中使用typedef X<B,A>,而是采用了另一种更强大的方法,并定义了一个本身带有两个模板参数的Sibling别名。

代码语言:javascript
复制
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编译上面的代码,它显示了以下错误消息:

代码语言:javascript
复制
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

我根本不明白为什么会出现错误消息,也不明白我该如何修复它。有人能给我解释一下问题出在哪里吗?

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-24 21:43:02

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

代码语言:javascript
复制
using AReverse = A::template Sibling<Right, Left>;

在本例中,::右侧的标识符(Sibling)不是一个类型,而是一个模板,这就是为什么需要这个消歧程序而不是typename的原因。

票数 10
EN

Stack Overflow用户

发布于 2013-07-14 14:56:38

以下是Clang所说的:

代码语言:javascript
复制
<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 
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11631919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档