2017-04-18 6 views
2

次のコードではエラーが発生しますが、なぜこのようなことが起こるのかわかりません。テンプレートテンプレートパラメータの引数がテンプレート以外の型であると表示される

#include <utility> 
#include <type_traits> 
#include <tuple> 

template <typename T, template <typename...> class F, typename = void> 
struct tuple_subtype_apply { 
    using type = typename tuple_subtype_apply<T, F, 
     std::make_index_sequence<std::tuple_size<T>::value>>::type; 
}; 

template <typename T, template <typename...> class F, std::size_t... Is> 
struct tuple_subtype_apply<T, F, std::index_sequence<Is...>> 
{ 
    using type = F<typename std::tuple_element<Is, T>::type...>; 
}; 

template <typename... Args> 
using true_t = std::true_type; 

template <template <typename...> class Fn, typename... Ts> 
struct prepend 
{ 
    template <typename... Args> 
    using fn = Fn<Ts..., Args...>; 
}; 

template <typename T, typename Tup> 
using test = typename tuple_subtype_apply<Tup, 
    prepend<true_t, T>::fn>::type; 

生成エラーは:(打ち鳴らす-std = C++ 1Z)

<source>:29:24: error: type/value mismatch at argument 2 in template parameter list for 'template<class T, template<class ...> class F, class> struct tuple_subtype_apply' 
    prepend<true_t, T>::fn>::type; 
        ^
<source>:29:24: note: expected a class template, got 'prepend<true_t, T>::fn' 

手動testのテンプレートパラメータを代入する(例えばtypename tuple_subtype_apply<std::tuple<int, int>, prepend<true_t, int>::fn>::type)エラーなしでコンパイル。 :: fnをテンプレート型にするべきではありませんか?

答えて

1

prepend<true_t, T>::fndependent nameであるため、fnの前にtemplateを追加する必要があります。

template <typename T, typename Tup> 
using test = typename tuple_subtype_apply<Tup, 
    prepend<true_t, T>::template fn>::type; 
関連する問題