Clang可变模板专用化错误:不可推导的模板参数
Clang variadic template specialization error: non-deducible template parameter
我用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>
{ };
实时演示
相关文章:
- 具有常量引用参数的函数模板专用化
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 具有多个参数的模板化类专用化,其中一个模板参数是模板本身
- 具有可变参数非类型参数的模板专用化
- 类专用化,没有用作专用化模板参数的类的模板参数
- 基于枚举参数调用专用模板方法
- 检查类是否具有模板专用化(使用布尔值或 int 等模板参数)
- 专用于可变参数模板成员函数
- 如何将模板类专用化为也接受模板模板参数
- 调用模板专用化,具有更多参数的单参数模板调用的特定值
- 有没有办法根据 lambda 参数返回类型部分专用化我的模板化函数?
- C++ 将派生类的成员函数指针作为参数传递时选择了错误的模板专用化
- cpp 模板专用化,错误说参数 1 的类型为 T,这取决于参数 T
- 具有不同非类型模板参数的模板类部分专用化
- 带有void类型和参数的C++11模板专用化
- 如何进行模板化类型化参数专用化?
- C++具有可变参数专用参数的模板,用于参数数量
- 使用类型参数专用化部分模板参数(VC++ v140 工具集)
- 模板模板可变参数专用化
- 将可变模板模板参数专用于最小数量的参数:合法或不合法