2017-02-06 5 views
3

テンプレートパラメータとして与えられたクラスに含まれるテンプレートクラスをインスタンス化しようとしています。これは、例を理解しやすいかもしれません:私はコメント行のコメントを解除した場合与えられたテンプレートパラメータを持つクラス内の変数を宣言します。

struct A { 
static constexpr int a = 42; 

class B { 
    int b; 
}; 

template<typename X> 
class C { 
    X c; 
}; 
}; 

template<typename U, typename T> 
class D { 
    int a = U::a; 

    using B = typename U::B; 
    B b; 

    //using C = typename U::C; 
    // C<T> c; 
    A::C<T> e; 
}; 


int main(void) { 
    D<A, int> d; 
    return 0; 
} 

、コンパイラは私にCがテンプレートではないと言うエラーが発生します。私はこの変数をインスタンス化するために他のアプローチを試みましたが、うまくいかなかった。私はe変数に相当するが、U型の名前を使用したいと思う。

答えて

5

Cをテンプレートタイプとして宣言していないので、C<T> cはテンプレートタイプとして使用できないためエラーが発生します。何をしたい

alias template(種類の家族のために名前)で、正しい構文は次のとおりです。D<A, int> d;、= AUと= intT

template <typename Z> 
using C = typename U::template C<Z>; 

その後、

C<T> c; // same as U::template C<T>; Z is substituted with T 

、 内はDA::C<int>と同じです。

LIVE

+0

私はすでにこれをしようとしたと私は、このエラーが持っていた:エラー:期待を「;」「<」C =型名Uを使用してトークン :: C Dam

+0

@Dam何コンパイラの前に?私はデモ[ここ](http://rextester.com/YIOAX7967)を試しました。 – songyuanyao

+0

いいえ、今は問題ありません。ありがとう:) – Dam

関連する問題