On C++ weekly ep. 48 by Jason Turner gibt den folgenden Code:Variadische Klassenvorlage und variadische Konstruktor
template<typename ... B>
struct Merged : B...
{
template <typename ... T>
Merged(T && ... t) : B(std::forward<T>(t))...
{ }
using B::operator()...;
};
Es schlägt mit dem folgenden auf gcc 7.1:
error: mismatched argument pack lengths while expanding 'B'
Was ist der richtige Weg B zu erweitern?
(BTW, in dem obigen Link scheint der Code mit einigen 7.0 Snapshot zu kompilieren).
Edit1:
Wie @ Jarod42 erwähnt, wird es kompilieren mit Structs als functors wirken. Das eigentliche Video verwendet Lambda und es scheint dort zu brechen.
auto l1 = [] { return 4 ; };
auto l2 = [](const int i) { return i * 10; };
// This would work, S1, S2 are just functors structs
Merged<S1, S2> merged1(42, "hello");
// This fails
Merged merged2 = Merged(l1, l2);
Edit2:
Scheint, wie benutzerdefinierte Abzug Führer funktioniert hier nicht.
Merged merged(l1, l2);
Aber es funktioniert nicht:
template <typename ... T>
Merged(T...) -> Merged<std::decay_t<T>...>;
Die oben sollte folgende Voraussetzungen erfüllt sein können. Es scheint, wie Sie die Typen zu Eingebunden <>
Merged<t1, t2> merged(l1, l2);
, die wahrscheinlich nicht wirklich, was das Tutorial demonstrieren wollte passieren müssen.
ist das nicht C++ 17 und nicht C++ 11? Zumindest bekomme ich [ganz andere Fehler beim Kompilieren mit C++ 11] (http://ideone.com/Pd4tRO) – user463035818
Ich nehme an, dass Sie dem Konstruktor die falsche Anzahl an Parametern zur Verfügung gestellt haben? – Quentin
Works [hier] (http://coliru.stacked-crooked.com/a/5bdcaec54f760c2). – Jarod42