2015-05-06 11 views
5

ich meine Füße mit C++ 11 und bin wirklich verwirrt Benetzen, warum dies nicht funktioniert:Initialisiererliste Konstruktor Fehler mit CRTP

template <class T> 
struct A { 
    size_t size() const { return sizeof(T); } 
}; 

struct B : A<B> { 
    int x; 
    int y; 
}; 

B var {1, 5}; 

Ich bin mit gcc 4.8.2 und einen Fehler sagen:

no matching function for call to 'B(<brace-enclosed initializer list>)' 

Es funktioniert gut, wenn ich von A nicht ableiten, so ist B die Ableitung irgendwie die POD-ness meiner Struktur ändern?

Antwort

10

Aggregat-Initialisierung erfordert, dass Ihr Typ ein Aggregat ist. Ein Aggregat kann nicht Basisklassen hat:

ein Aggregat ist, einen Array oder eine Klasse (Ziffer 9) ohne Benutzer bereitgestellten Konstruktoren (12.1), keine private oder nicht-statische Datenelemente (Ziffer 11) geschützt , keine Basisklassen (Abschnitt 10) und keine virtuellen Funktionen (10.3).

+0

Ah, so der zweite Teil von [diese Antwort] (http://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods-and-how-why-are-they-special/7189821 # 7189821) trifft nicht zu. Vielen Dank. – eddi

+2

Dies [könnte sich in C++ 17 ändern] (http://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods-and-how-why-are-they-special/27511360#comment47403725_27511360) Derzeit wird ein Vorschlag in Erwägung gezogen. –