Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可变模板错误:';在';(通用条款9.2)_C++_Gcc_C++17_Variadic Templates_Deduction Guide - Fatal编程技术网

C++ 可变模板错误:';在';(通用条款9.2)

C++ 可变模板错误:';在';(通用条款9.2),c++,gcc,c++17,variadic-templates,deduction-guide,C++,Gcc,C++17,Variadic Templates,Deduction Guide,我正在学习Jason Turner的c++17上的可变模板,然后复制他的示例代码(如下所示)。在他的视频中,他使用gcc 7的网站 #include <utility> template<typename ... B> struct Merged : B ... { template<typename ... T> Merged(T&& ... t) : B(std::forward<T>(t))...

我正在学习Jason Turner的c++17上的可变模板,然后复制他的示例代码(如下所示)。在他的视频中,他使用gcc 7的网站

#include <utility>

template<typename ... B>
struct Merged : B ... {
       template<typename ... T>
       Merged(T&& ... t) : B(std::forward<T>(t))... {}

    using B::operator()...;
};

template<typename ... T>
Merged(T...) -> Merged<std::decay_t<T>...>;

int main() {
    const auto l1 = []() { return 4; };
    const auto l2 = [](const int i) { return i * 10; };

    Merged merged(l1,
                  l2,
                  [](const double d) { return d * 3.2; });

    return 0;
}

这个错误意味着什么?我需要做什么来修复它

据我所知,你的代码没有错

我怀疑是g++错误

要修复它。。。好。。。绕过它。。。不要问我为什么,但我知道这是可行的,对于这两个编译器,都需要在变量列表之前的第一个模板参数,用于
Merged

我的意思是:下面的
struct

template <typename B0, typename ... B>
struct Merged : public B0, public B ...
 {
   template <typename T0, typename ... T>
   Merged (T0 && t0, T && ... t)
      : B0{std::forward<T0>(t0)}, B{std::forward<T>(t)}...
    { }

   using B0::operator();
   using B::operator()...;
};
并使用带有必需参数的演绎指南

template <typename T0, typename ... T>
Merged (T0, T ...) 
   -> Merged<std::decay_t<T0>, std::decay_t<T>...>;
模板
合并(T0,T…)
->合并;

在…
的实例化中不是完整的错误消息
在“merged”之前缺少模板参数
表示您忘记了
-std=c++17
。在添加缺少的标志后,我得到了这样的结果:出于某种原因,GCC将
B
推断为一个空列表,忽略推断指南。同样的代码在Clang中工作,所以看起来像是一个GCC错误。@HolyBlackCat有点奇怪,因为我使用了这个标志。。。(我编辑了这个问题来展示)这对我帮助很大!因此,主要问题在于gcc的演绎指南(DG)。事实上,它需要两个DG(而不是替换),因为仅使用DG,我无法仅使用一个参数实例化合并。
template <typename T0, typename ... T>
Merged (T0, T ...) 
   -> Merged<std::decay_t<T0>, std::decay_t<T>...>; 
template <typename ... B>
struct Merged: public B ...
 {
   template <typename ... T>
   Merged (T && ... t)
      : B{std::forward<T>(t)}...
    { }

   using B::operator()...;
};
template <typename T0, typename ... T>
Merged (T0, T ...) 
   -> Merged<std::decay_t<T0>, std::decay_t<T>...>;