2016-11-19 12 views
0

簡潔にするために、テンプレート引数をその明示的インスタンス化で1回だけ指定したいと思いますが、コンパイラエラーが発生しています。私はType alias, alias templateのcppreferenceに記述されているようにC++の構文を使用しようとしています。ここに私のサンプルコードがあります:テンプレートの宣言で重複するテンプレート引数を取り除く方法

struct M {}; 

template< typename T1 > 
struct S {}; 

template< typename T2, typename T3 > 
struct N {}; 

// type alias used to hide a template parameter (from cppreference under 'Type alias, alias template') 
//template< typename U1, typename U2 > 
//using NN = N< U1, U2<U1> >; // error: attempt at applying alias syntax: error C2947: expecting '>' to terminate template-argument-list, found '<' 

int main() 
{ 
    N< M, S<M> > nn1; // OK: explicit instantiation with full declaration, but would like to not have to use M twice 
    // NN< M, S > nn2; // desired declaration, error: error C2947: expecting '>' to terminate template-argument-list, found '<' 

    return 0; 
} 

ここで問題は何ですか?

答えて

3

typename U2は、テンプレートではなくタイプ名です。したがって、U2<U1>は意味をなさない。テンプレートテンプレートパラメータに置き換えます

template< typename U1, template<typename> class U2 > 
using NN = N< U1, U2<U1> >; 

demo

関連する問題