2017-04-18 1 views
2

Le code suivant génère une erreur, mais je ne suis pas sûr de savoir pourquoi c'est le cas.L'argument pour le paramètre de modèle de modèle semble être un type sans modèle

#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; 

L'erreur produite: (clang 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' 

remplaçant manuellement les paramètres de modèle pour test compile sans erreur (par exemple typename tuple_subtype_apply<std::tuple<int, int>, prepend<true_t, int>::fn>::type). Ne devrait pas préfixe :: fn être un type de modèle?

Répondre

1

Depuis prepend<true_t, T>::fn est un dependent name, template doit être ajouté avant fn.

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