2

我正在 Jason Turner 的youtube 频道上学习关于 c++17 的可变参数模板,然后我复制了他的示例代码(如下所示)。在他的视频中,他使用了带有 gcc 7的网站godbolt.org 。

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

我使用 gcc 9.2 在我的计算机上尝试了代码,但出现以下错误:

在 'Merged::Merged(T&& ...) 的实例化中(使用 T = {const main()::&, const main()::&, main()::}; B = {}]':

我尝试使用 Godbolt 站点进行检查,但它也无法编译(使用 gcc 7.1 和 gcc 9.2)并给出更多错误,例如:

错误:在“合并”之前缺少模板参数合并合并(l1,

错误: ')' 标记 [](const double d) { return d * 3.2; 之前的预期主表达式;});

这个错误是什么意思,我需要做些什么来修复它?

在我的电脑中编译行:

g++ -Wall -fexceptions -O2 -pedantic -Wextra -Wall -std=c++1z -m64  -c /home/thearquitect/Desktop/C++/variadic.cpp -o ~/Desktop/obj/variadic.o
g++ -o ~/Desktop/bin/variadic ~/Desktop/obj/variadic.o -s -m64

神箭试试

4

1 回答 1

1

这个错误是什么意思,我需要做些什么来修复它?

据我了解,您的代码没有任何问题。

我怀疑是一个 g++ 错误。

修复它......好吧......绕过它......不要问我为什么,但我认为这对两个编译器都有效,需要第一个模板参数,在可变参数列表之前,for 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>...>; 

适用于两种编译器。

您的原始扣除指南也适用于修改后的struct.

- 编辑 -

我看到你也可以解决问题(用两个编译器编译)struct只用可变参数列表来维护

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>...>;
于 2020-03-07T14:49:03.290 回答