Frage

Ich kann dies nicht auf VS2013 kompilieren, aber es wird auf gcc 4.7.2 kompiliert.Ich verstehe, dass VC++ hinsichtlich der Funktionen hinter GCC und CLang zurückbleibt, aber um welche Funktion handelt es sich genau, und wenn nicht, handelt es sich um einen Fehler, nicht wahr?

template <int N>
struct factorial
{
    static const long value;
    static const long previous = factorial<N - 1>::value; //C2057: expected constant expression
};

template <int N>
const long factorial<N>::value = N*factorial<N - 1>::value;

template <>
struct factorial<0>
{
    static const long value = 1;
};

Bitte sagen Sie mir nicht, wie ich dieses Problem umgehen kann, da dies kein Produktionscode ist und ich auch keinen benötige.Ich kann zum Beispiel einen Wert in der Klasse definieren und das Problem ist gelöst, aber gehen wir davon aus, dass ich ihn außerhalb der Klasse definieren muss (VC2013 unterstützt constexpr immer noch nicht).

War es hilfreich?

Lösung

MSVC verfügt nicht über eine ordnungsgemäße zweiphasige Vorlagenkompilierung.GCC sieht richtig factorial<N - 1>::value als abhängiger Name und wird in der zweiten Phase aufgelöst, MSVC muss dies jedoch in der ersten Phase tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top