c++ - 模板模板参数的参数似乎是非模板类型

标签 c++ templates template-meta-programming

以下代码会产生错误,但我不确定为什么会出现这种情况。

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

产生的错误:(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'

手动替换 test 的模板参数编译没有错误(例如 typename tuple_subtype_apply<std::tuple<int, int>, prepend<true_t, int>::fn>::type )。 Prepend::fn 不应该是模板类型吗?

最佳答案

prepend<true_t, T>::fndependent name , template需要在fn之前添加.

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

关于c++ - 模板模板参数的参数似乎是非模板类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43463705/

相关文章:

c++ - 模板编程和位域

c# - Unity3D调用外部dll

c++ - ffmpeg转OpenGL纹理黑屏

c++ - 基类中的模板化类成员,不存在于派生类中

c++ - 在类模板中存储可变参数

c++ - C++ 中的插件框架

c++ - 函数成员中的 enable_if 用于 void 和继承

c++ - std::reference_wrapper 的问题

c++ - 使用git中的cparse库解析用户输入的字符串

c++ - 为什么在匿名命名空间中定义模板时出现内部链接错误?