Variadic template error: 'In instantiation of' (gcc 9.2)
Variadic template error: 'In instantiation of' (gcc 9.2)
我正在使用 gcc 7 在 Jason Turner 的 youtube channel then I copy his example code (shown below). In his video he uses the site godbolt.org 上学习 c++17 上的可变参数模板。
#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 尝试了代码,但出现了以下错误:
In instantiation of 'Merged::Merged(T&& ...) (with T = {const main()::&, const main()::&, main()::}; B = {}]':
我尝试使用 godbolt 站点来检查它,但它也无法编译(使用 gcc 7.1 和 gcc 9.2)并给出更多错误,例如:
error: missing template arguments before 'merged'Merged merged(l1,
和
error: expected primary-expression before ')' token [](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
What this error means and what I need to do do fix it?
据我了解,您的代码没有任何问题。
我怀疑是 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>...>;
我正在使用 gcc 7 在 Jason Turner 的 youtube channel then I copy his example code (shown below). In his video he uses the site godbolt.org 上学习 c++17 上的可变参数模板。
#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 尝试了代码,但出现了以下错误:
In instantiation of 'Merged::Merged(T&& ...) (with T = {const main()::&, const main()::&, main()::}; B = {}]':
我尝试使用 godbolt 站点来检查它,但它也无法编译(使用 gcc 7.1 和 gcc 9.2)并给出更多错误,例如:
error: missing template arguments before 'merged'Merged merged(l1,
和
error: expected primary-expression before ')' token [](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
What this error means and what I need to do do fix it?
据我了解,您的代码没有任何问题。
我怀疑是 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>...>;