我正在杰森·特纳(Jason Turner)的youtube channel上了解c ++ 17上的可变参数模板,然后复制他的示例代码(如下所示)。在他的视频中,他将站点godbolt.org与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;
}
我在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
此错误是什么意思,我需要做些什么来解决?
据我所知,您的代码没有错。
我怀疑是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>...>;
同时使用两个编译器。
您的原始推论指南也适用于修改后的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>...>;