Clang可变模板专用化错误:不可推导的模板参数

Clang variadic template specialization error: non-deducible template parameter

本文关键字:参数 专用 Clang 错误      更新时间:2023-10-16

我用clang++-600.0.51:编译了以下代码

template<typename ... Args> struct seq{};
template<typename Seq, size_t c = 1> struct pop_back;
template<typename ... Args> struct pop_back <seq<Args...>,  0>{
    typedef seq<Args...> type;
};
template<typename ... Args, typename T, size_t c> struct pop_back <seq<Args..., T>,  c>{
    typedef typename pop_back<seq<Args...>, c - 1>::type type;
};

我得到了一个错误:类模板部分专业化包含的模板参数无法推断;这种部分专业化永远不会被使用[-Werror]

我似乎以错误的方式专门化了varadic模板,但gcc 4.8.2和vc 2013可以成功编译它 如果我只是如上定义pop_back,那么gcc和vc都会被传递。如果我实例化pop_back,所有这些都会失败。

我的代码是非标准的吗?如何为此编写变通方法?

由于编译器无法确定参数包Args...的末尾,因此无法推导出

T。您需要一个不同的实现。这一个连接序列的各个元素,而c减少。

namespace detail
{
template <typename S1, typename S2>
struct concat_impl;
template <typename... Ts, typename... Us>
struct concat_impl<seq<Ts...>, seq<Us...>>
{
    using type = seq<Ts..., Us...>;
};
template <typename S1, typename S2>
using concat = typename concat_impl<S1, S2>::type;
template <typename Seq, size_t c = 1, typename = void>
struct pop_back;
template <typename T, typename... Args, size_t c>
struct pop_back<seq<T, Args...>,  c, typename std::enable_if<c!=0>::type>
{
    using type = concat<seq<T>, typename pop_back<seq<Args...>, c-1>::type>;
};
template <typename... Args>
struct pop_back<seq<Args...>, 0>
{
    using type = seq<>;
};
} // detail
template <typename Sequence, size_t c>
struct pop_back;
template <typename... Args, size_t c>
struct pop_back<seq<Args...>, c> : detail::pop_back<seq<Args...>, sizeof...(Args) - c>
{ };

实时演示