2017-02-17 7 views
2

using行を修正するにはどうすればよいですか?タイプバンドルからテンプレートテンプレートパラメータを解凍する

test_temp.cpp:

test_temp.cpp:14:63: error: expected an identifier or template-id after '::' 
using X_b = X<typename T_b::A, typename T_b::B, typename T_b::template C>; 
                 ~~~~~^ 

++打ち鳴らすから

#include <memory> 
template <typename A, typename B, template<typename> class C> 
class X {}; 

template <typename A1, typename B1, template<typename> class C1> 
class Type_bundle { 
public: 
    typedef A1 A; 
    typedef B1 B; 
    template<typename T> using C = C1<T>; 
}; 

template <typename T_b> 
using X_b = X<typename T_b::A, typename T_b::B, typename T_b::template C>; 


int main() { 
    typedef Type_bundle<int,float,std::allocator> Ttb; 
    X_b<Ttb> x; 
} 

エラーがなぜこの仕事をしませんの?

答えて

3

あなたが書くとき:

template <typename T_b> 
using X_b = X<typename T_b::A, typename T_b::B, typename T_b::template C>; 
//            ~~~~~~~~~ 

次にくるものが型の名前になることを示唆しています。しかし、T_b::template Cは型ではなく、テンプレートなので、この構文は無効です。 typename T_b::template C<D>のように、パラメータをCに渡す場合は、その構文を使用します。そこには、typenametemplateの両方が必要です。何をしたい

だけです:

template <typename T_b> 
using X_b = X<typename T_b::A, typename T_b::B, T_b::template C>; 

ませんtypename

-1

これは、コンパイルされます。

#include <memory> 
template <typename A, typename B, template<typename> class C> 
class X {}; 

template <typename A1, typename B1, template<typename> class C1> 
class Type_bundle { 
public: 
    typedef A1 A; 
    typedef B1 B; 
    template<typename T> using C = C1<T>; 
}; 

template <typename T_b> 
using X_b = X<typename T_b::A, typename T_b::B, 
       T_b::template C >; 
int main() { 
    typedef Type_bundle<int,float,std::allocator> Ttb; 
    X_b<Ttb> x; 
} 
+0

これがなぜ機能するのかわかりません。しかし、 'typename T'、' template'などのさまざまな組み合わせを試した後、私はこれを取得します。テンプレートがもっと複​​雑になるならば、この種のブルートフォース検索はとても面白いです。 –

関連する問題