2010-05-07 20 views
16

napisałem ten program w VC++ 2010:initializer_list nie pracuje w VC10

class class1 
{ 
public: 
class1 (initializer_list<int> a){}; 
int foo; 
float Bar; 
}; 
void main() 
{ 
class1 c = {2,3}; 
getchar(); 
} 

ale otrzymuję ten błąd, gdy mogę skompilować projekt:

Error 1 error C2552: 'C': non -aggregates nie można zainicjować z initializer listy C: \ Users \ pswin \ Documents \ wizualnych studio 2010 \ Projects \ test_C++ 0x \ test_C++ 0x \ main.cpp 27

i

2 IntelliSense: inicjalizacji z '{...}' nie jest dozwolone dla przedmiotu typu "Class1" C: \ Users \ pswin \ Documents \ wizualny studio 2010 \ projects \ test_C++ 0x \ test_C++ 0x \ main.cpp 27

na czym polega problem?

+0

Wygląda na to, że musisz używać tablic dla tej funkcji ... "agregaty" tak naprawdę brzmi tak ... :) – Zoltan

Odpowiedz

34

To nie powinno być obsługiwane at all:

[...] funkcja C++ 0x Rdzeń Język list inicjująca i związane z nimi zmiany standardowe biblioteki nie były realizowane w VC10.

komunikat błędu dotyczy wstępnego C++ 0X cechą łącznej inicjalizacji, która umożliwia inicjalizacji pewnych typów określonych przez użytkownika za pomocą nawiasów klamrowych:

struct pair { int first; char second; }; 
pair p = { 0, 'c' }; 

kruszywa określa §8.5.1:

agregat jest tablicą lub klasy (klauzula 9) bez konstruktorów zadeklarowana przez użytkownika (12,1), żadne prywatne lub chronione non-statyczne członkowie danych (klauzula 11), nie baza do lasses (klauzula 10) i brak funkcji wirtualnych (10.3).

Po zainicjowaniu agregatu inicjator może zawierać inicjującą klauzulę składającą się z zamkniętej w nawiasach, rozdzielanej przecinkami listy klauzul inicjalizujących dla członków agregatu, zapisanych w rosnącym indeksie dolnym lub członku. Jeżeli agregat zawiera subagregaty, reguła ta odnosi się rekurencyjnie do członków subagregatu.