Betrachten Sie die folgenden vereinfachten Vorlage Meta-Programmiercode, der eine Angle
Klasse implementiert, die intern die Modulo 360 Grad reduziert Wert speichert.Auto + statische In-Klasse-Konstante Initialisierung mit Meta-Programmierung
#include <iostream>
#include <typeinfo>
template<int N, int D>
struct Modulus
{
static auto const value = N % D;
};
template<int N>
struct Angle
{
static auto const value = Modulus<N, 360>::value; // ERROR
//static int const value = Modulus<N, 360>::value; // OK
//static auto const value = N % 360; // OK
typedef Angle<value> type;
};
int main()
{
std::cout << typeid(Angle<30>::type).name() << "\n";
std::cout << typeid(Angle<390>::type).name() << "\n";
return 0;
}
Ausgabe am Ideone
Mit Visual C++ 2010 Express, ich static auto const = Modulus<N, 360>::value
tun können, aber mit MinGW gcc 4.7.2 (Nuwen distro) oder Ideone (gcc 4.5.1) Ich muss entweder explizit die Bezeichnung Geben Sie static int const value = Modulus<N, 360>::value
ein, oder ich muss mit dem vollen modularen Ausdruck als verwenden.
Frage: Welcher Compiler ist korrekt nach dem neuen C++ 11 Standard?
Ja, in gcc 4.5.1 ist die Unterstützung für C++ 11 immer noch sehr unvollständig, Sie sollten http://gcc.gnu.org/projects/cxx0x.html überprüfen, welche Funktionen in welcher Version verfügbar sind. –
@hvd, falsch. diese müssen als conetexpr deklariert werden. –
@SegFault Ich bekomme diese Fehler auch mit MinGW 4.7 – TemplateRex