14

今日、usingキーワード inを使用して問題が発生しましたC++11。ここで別のアプローチを使用することにしました (以下の例にコメントとして追加されています)。Xを mixinのマトリックスと考えることができ、目的はinYの転置されたマトリックス型にアクセスすることです。にing する代わりに、より強力な別のアプローチを採用し、2 つのテンプレート パラメーター自体を受け取るエイリアスを定義します。XYtypedefX<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

なぜエラー メッセージが表示されるのか、またはどのように修正できるのかがまったくわかりません。誰かが私に問題が何であるかを説明できますか?

どうもありがとう!

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 に答える