Compilerfehler C2552
Aktualisiert: November 2007
Fehlermeldung
'Bezeichner' : Initialisierung nicht zusammengesetzter Typen mit Initialisiererliste ist nicht möglich
'identifier' : non-aggregates cannot be initialized with initializer list
Der Aggregatbezeichner wurde in einer nicht gültigen Weise initialisiert.
Aggregate werden wie folgt definiert:
Arrays
Klassen, Strukturen und Unions, die nicht über folgende Elemente verfügen:
Konstruktoren
private-Member oder protected-Member
Basisklassen
Virtuelle Funktionen
Darüber hinaus sind in Visual C++ Datentypen in Aggregaten, die Konstruktoren enthalten, nicht zulässig.
Beim Versuch, für einen Typ eine Aggregatinitialisierung durchzuführen, kann aus den folgenden Gründen C2552 ausgelöst werden:
Der Typ verfügt über einen oder mehrere benutzerdefinierte Konstruktoren.
Der Typ verfügt über einen oder mehrere nicht statische private Datenmember.
Der Typ verfügt über eine oder mehrere virtuelle Funktionen.
Der Typ verfügt über eine Basisklasse.
Der Typ ist eine Verweisklasse oder eine CLR-Schnittstelle.
Der Typ ist skalar (int i = {};)
Der Typ verfügt über ein Array ohne festgelegte Größe (Array der Größe 0), dessen Elemente über Destruktoren verfügen.
Im folgenden Beispiel wird C2552 generiert:
// C2552.cpp
// compile with: /clr
#include <string>
using namespace std;
struct Pair_Incorrect {
private:
string m_name;
double m_val;
};
struct Pair_Correct1 {
public:
Pair_Correct1(string name, double val)
: m_name(name), m_val(val) {}
private:
string m_name;
double m_val;
};
struct Pair_Correct2 {
public:
string m_name;
double m_val;
};
int main() {
// To fix, add a constructor to this class and use it for
// initializing the data members, see Pair_Correct1 (below)
// or
// Do not have any private or protected non-static data members,
// see Pair_Correct2 (below). Pair_Correct2 is not recommended in
// case your object model requires some non-static data members to
// be private or protected
string name("John");
Pair_Incorrect pair1 = { name, 0.0 }; // C2552
// initialize a CLR immutable value type that has a constructor
System::DateTime dt = {2001, 4, 12, 22, 16, 49, 844}; // C2552
Pair_Correct1 pair2( name, 0.0 );
Pair_Correct1 pair3 = Pair_Correct1( name, 0.0 );
Pair_Correct2 pair4 = { name, 0.0 };
System::DateTime dt2(2001, 4, 12, 22, 16, 49, 844);
}