This question already has answers here:
Where and why do I have to put the “template” and “typename” keywords?
(6个答案)
3年前关闭。
以下代码会产生错误,但是我不确定为什么会这样。
产生的错误:(clang -std = c++ 1z)
手动将模板参数替换为
(6个答案)
3年前关闭。
以下代码会产生错误,但是我不确定为什么会这样。
#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
)。不应该将::: fn用作模板类型? 最佳答案
由于prepend<true_t, T>::fn
是dependent 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/