GCC-Fehler bei verschiedenen Vorlagen: "Entschuldigung, nicht implementiert: 'Bezeichner ...' kann nicht zu einer Argumentliste mit fester Länge erweitert werden."

Bei der variablen Template-Programmierung in C ++ 11 unter GCC wird gelegentlich die Fehlermeldung "Entschuldigung, nicht implementiert: 'Identifier ...' kann nicht zu einer Arugment-Liste mit fester Länge erweitert werden" angezeigt. Wenn ich das "..." im Code entferne, wird ein anderer Fehler angezeigt: "Fehler: Parameterpakete wurden nicht mit" ... "erweitert."

Wenn ich also das "..." eingebe, nennt GCC das einen Fehler, und wenn ich das "..." herausnehme, nennt GCC das auch einen Fehler.

Der einzige Weg, wie ich damit umgehen konnte, ist, das Template-Metaprogramm von Grund auf neu zu schreiben, und (mit etwas Glück) irgendwann Code zu finden, der den Fehler nicht verursacht. Aber ich würde wirklich gerne wissen, was ich falsch gemacht habe. Trotz des Googelns und trotz vieler Experimente kann ich nicht genau sagen, was ich anders mache, zwischen variablem Vorlagencode, der diesen Fehler verursacht, und Code, der den Fehler nicht aufweist.

Der Wortlaut der Fehlermeldung scheint zu implizieren, dass der Code gemäß dem C ++ 11-Standard funktionieren sollte, aber dass GCC ihn noch nicht unterstützt. Oder ist es vielleicht ein Compiler-Fehler?

Hier ist ein Code, der den Fehler erzeugt. Hinweis: Sie müssen keine korrekte Implementierung für mich schreiben, sondern nur darauf hinweisen, was an meinem Code liegt, der diesen bestimmten Fehler verursacht

// Used as a container for a set of types.
template <typename... Types> struct TypePack
{
    // Given a TypePack<T1, T2, T3> and T=T4, returns TypePack<T1, T2, T3, T4>
    template <typename T>
    struct Add
    {
        typedef TypePack<Types..., T> type;
    };
};

// Takes the set (First, Others...) and, while N > 0, adds (First) to TPack.
// TPack is a TypePack containing between 0 and N-1 types.
template <int N, typename TPack, typename First, typename... Others>
struct TypePackFirstN
{
    // sorry, unimplemented: cannot expand ‘Others ...’ into a fixed-length argument list
    typedef typename TypePackFirstN<N-1, typename TPack::template Add<First>::type, Others...>::type type;
};

// The stop condition for TypePackFirstN:  when N is 0, return the TypePack that has been built up.
template <typename TPack, typename... Others>
struct TypePackFirstN<0, TPack, Others...> //sorry, unimplemented: cannot expand ‘Others ...’ into a fixed-length argument list
{
    typedef TPack type;
};

BEARBEITEN: Ich habe festgestellt, dass eine teilweise Template-Instanziierung, die so aussieht, den Fehler verursacht:

template <typename... T>
struct SomeStruct<1, 2, 3, T...> {};

Das Umschreiben führt nicht zu einem Fehler:

template <typename... T>
struct SomeStruct<1, 2, 3, TypePack<T...>> {};

Es scheint, dass Sie könnenerklären Parameter zu Teilspezialisierungen variadisch sein; diese Zeile ist OK:

template <typename... T>

Aber das kannst du eigentlich nichtbenutzen Diese Parameterpakete in der Spezialisierung, d. h. dieser Teil ist nicht OK:

SomeStruct<1, 2, 3, T...>

Die Tatsache, dass Sie es zum Laufen bringen können, wenn Sie die Packung in einen anderen Typ einwickeln, d. H. Wie folgt:

SomeStruct<1, 2, 3, TypePack<T...>>

für mich bedeutet das dasErklärung der variadic Parameter auf eine teilweise Template-Spezialisierung war erfolgreich, und Sie können es einfach nicht direkt verwenden. Kann das jemand bestätigen?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage