Z praktycznego punktu widzenia, rozumiem, że zarówno typedef
i test
są nieco „zbędny” i muszą zostać usunięte, jeśli chcemy następujący kod do kompilacji:Dlaczego szablony typedef są nielegalne?
template< typename type_t >
typedef struct tagTest
{
int a;
} test;
Jednak myślałem, że zbiór Deklaracje typedef stanowiły podzbiór zbioru deklaracji. Po prostu przydarzyło się, że mają specyficzny specyfikator dekodowania . To była moja racjonalizacja dla
typedef struct tagTest
{
int a;
} test;
wprowadzającej identyfikator test
i deklarując strukturę tagTest
. Jeśli ta interpretacja jest poprawna, to następujący akapit ze standardu powinien pozwolić na template
typedef
(chociaż nie ze znaczeniem podanym przez słowo kluczowe using
).
Oświadczenie w szablonie-zgłoszeniu są - (1,1) stwierdzenie czy zdefiniowania funkcji, klasę lub zmienna lub - (1.2) określić funkcję członu klasa człon , a wyliczenie element lub statyczny element danych z klasy matrycy lub klasy zagnieżdżone w szablonie klasy lub - (1,3) określenie szablonu do klasy lub klasy szablonu lub - (1,4) być deklaracją aliasową.
Nie widzę błędu w moim uzasadnieniu, ale wniosek jest nielegalny.
Jakie są odpowiednie części normy, które rozwiązują powyższą zagadkę?
UPDATE Część powyższego rozumowania wykorzystuje fakt, że typedef
struct
deklaruje strukturę. Specyfikator typedef
, o ile rozumiem, oznacza, że zadeklarowane zmienne są naprawdę typami. Oznacza to, że typedef
aktualizuje się z samej zmiennej do typu, który jest równoważny z deklarowanym tagTest
. Dlatego poniższy kod kompiluje (aczkolwiek z ostrzeżeniem).
typedef struct tagTest
{
int a;
};
tagTest t;
Jedna z odpowiedzi zajmuje się zbędnym test
.Ale możliwe jest użycie typedef bez declarator because „Init-declarator-lista jest opcjonalny podczas deklarowania nazwanego klasa/struct/Unii lub nazwie wyliczanie”
Er ... Żaden z tych przypadków go nie obejmuje. Fakt, że deklaracja zawiera coś, co deklaruje klasę, nie oznacza, że deklaracja sama deklaruje klasę. Deklaracja ogranicza się do zdefiniowania rodzaju. – hvd
@ hvd W języku C, typedef zawierający znakowaną strukturę deklaruje tę strukturę, a także definiuje nazwę, która ją modyfikuje. Czy mówisz, że C++ jest inny pod tym względem? – davmac
@davmac Nie, zgadzamy się co do końcowego efektu takiej deklaracji. Twierdzę, że częścią, która powoduje, że struktura jest deklarowana, nie jest sama deklaracja, tylko podskładnik tej deklaracji. Dotyczy to zarówno C jak i C++. – hvd