我今天使用using
中的C++11
关键字遇到了问题。我现在决定使用另一种方法(在下面的例子中添加为注释)。您可以将X
视为Y
作为mixin的矩阵,目的是访问X
中Y
的转置矩阵类型。我们采用另一种功能更强大的方法,而不是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
我不明白为什么要收到错误信息或我如何解决它。有人可以向我解释问题是什么吗?
非常感谢!
答案 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