initializer_list arbeiten nicht in VC10
-
04-10-2019 - |
Frage
Ich schrieb dieses Programm in VC ++ 2010:
class class1
{
public:
class1 (initializer_list<int> a){};
int foo;
float Bar;
};
void main()
{
class1 c = {2,3};
getchar();
}
, aber ich diesen Fehler erhalten, wenn i-Projekt kompilieren:
Fehler 1 Fehler C2552: 'c': Nicht-Aggregate können nicht initialisiert werden mit initializer Liste c: \ users \ pswin \ Dokumente \ visuelle Studio \ 2010 \ projects test_c ++ 0x \ test_c ++ 0x \ main.cpp 27
und
2 IntelliSense: Initialisierung mit ‚{...}‘ ist nicht für Objekt erlaubt von Art "Class1" c: \ users \ pswin \ Dokumente \ visuelle Studio \ 2010 \ projects test_c ++ 0x \ test_c ++ 0x \ main.cpp 27
Was ist das Problem?
Lösung
Es sollte nicht unterstützt bei allen :
[...] die C ++ 0x Core-Sprache-Funktion von initializer Listen und den zugehörigen Standardbibliothek Änderungen wurden in VC10 nicht implementiert.
Die Fehlermeldung bezieht sich auf die Pre-C ++ 0x Merkmal aggregierte Initialisierung, die durch Verwendung von geschweiften Klammern die Initialisierung bestimmter benutzerdefinierte Typen ermöglicht:
struct pair { int first; char second; };
pair p = { 0, 'c' };
Aggregate sind definiert in §8.5.1 :
Ein Aggregat ist ein Array oder eine Klasse (Ziffer 9) ohne User-deklarierten Konstruktoren (12.1), keine privaten oder geschützte nicht-statische Datenelemente (Ziffer 11), keine Basisklassen (Ziffer 10), und keine virtuelle Funktionen (10.3).
Wenn ein Aggregat initialisiert der Initialisierer eine Initialisierer-Klausel enthalten kann, bestehend aus einem brace- eingeschlossen ist, durch Kommata getrennte Liste von Initialisierer-Klauseln für die Mitglieder des Aggregats, geschrieben in zunehmenden tief- oder Mitglied Reihenfolge. Wenn das Aggregat subaggregates enthält, gilt diese Regel rekursiv an die Mitglieder des Unteraggregat.