2015-08-08 36 views
8

Standard mówi: "Członek klasy T nie może używać T jako nazwy, jeśli element jest statycznym elementem danych, funkcją składową, typem elementu, szablonem członka, modułem wyliczającym nieskopiowanego wyliczenia, członka anonimowej unii członkowskiej, jednak niestatyczny element danych może używać nazwy T, o ile nie ma konstruktorów deklarowanych przez użytkownika. "element danych o nazwie klasy

Jednak jeśli utworzę tę klasę, spowoduje to błąd kompilacji.

class G 
{ 
    int G; 
}; 

Używam VS2013. Czy nie jest dozwolone w Microsoft lub?

+3

Jaki jest błąd kompilacji? Działa to z Clang i GCC. – Hamdor

+10

Kompilatory microsoft są (nie) słyną z braku zgodności z jakimkolwiek standardem. –

+0

error: C2380: type (s) before 'G' (konstruktor z typem powrotu lub nielegalna redefinicja bieżącej nazwy klasy?) Tak więc, nie pozwalają na to :( –

Odpowiedz

3

Jeśli VC++ na to nie pozwala, jest to błąd.

Jednak ta "funkcja" języka ma na celu kompatybilność z C, a firma Microsoft zdecydowała się nie podkreślać C. Na przykład funkcje C99 są z reguły niedostępne, dopóki nie zostaną przyjęte przez C++. Nigdy nie należy celowo deklarować takiego członka w C++.

(to wolno w C po prostu domyślnie: nie istnieją żadne ograniczenia dotyczące nazewnictwa członków, a wszyscy jej członkowie są nonstatic członkowie danych).