Da un punto di vista pratico, capisco che sia typedef
e test
sono un po ' "superflui" e devono essere rimossi se vogliamo che il seguente codice per compilare:Perché i modelli typedef sono illegali?
template< typename type_t >
typedef struct tagTest
{
int a;
} test;
Tuttavia, ho pensato che l'insieme di le dichiarazioni typedef erano un sottoinsieme dell'insieme di dichiarazioni. Si è appena verificato uno specifico identificatore decimale . Quello era il mio razionalizzazione
typedef struct tagTest
{
int a;
} test;
introducendo l'identificatore test
e dichiarando la struttura tagTest
. Se tale interpretazione è corretta, il paragrafo seguente dello standard dovrebbe consentire template
typedef
(anche se non con il significato fornito dalla parola chiave using
).
La dichiarazione in un modello-dichiarazione sono - (1.1) dichiarare o definire una funzione, una classe o una variabile, o - (1.2) definire una funzione membro, una classe membro , un'enumerazione membro o un membro dati statico di una classe template o di una classe inserita all'interno di una classe template, o - (1.3) definiscono un modello membro di una classe template o una classe, o - (1,4) essere una dichiarazione alias.
Non riesco a vedere l'errore nel mio ragionamento, tuttavia la conclusione è illegale.
Quali sono le parti rilevanti dello standard che risolvono l'enigma sopra?
UPDATE Una parte del ragionamento di cui sopra utilizza il fatto che typedef
struct
dichiara una struttura. L'identificatore typedef
, per quanto ho capito, implica che tutte le variabili dichiarate siano realmente dei tipi. Vale a dire, lo typedef
aggiorna test
da una semplice variabile a un tipo che è equivalente allo tagTest
dichiarato. Questo è il motivo per cui il seguente codice viene compilato (anche se con un avvertimento).
typedef struct tagTest
{
int a;
};
tagTest t;
Una delle risposte si occupa del superfluo test
.Ma, è possibile usare typedef senza un dichiaratore because "Init-dichiaratore-list è facoltativo quando si dichiara una classe/struct/union di nome o di un nome di enumerazione"
Er ... Nessuno di quei casi lo copre. Il fatto che la dichiarazione capiti di contenere qualcosa che dichiarerebbe una classe non significa che la dichiarazione stessa dichiari una classe. La dichiarazione definisce semplicemente un tipo. – hvd
@hvd In C, un typedef che contiene una struttura taggata dichiara la struct e definisce un nome che lo alias. Stai dicendo che C++ è diverso in questo senso? – davmac
@davmac No, siamo d'accordo sull'effetto finale di una tale dichiarazione. Sto dicendo che la parte che causa la dichiarazione della struttura non è la dichiarazione stessa, ma solo un sottocomponente di quella dichiarazione. E questo vale sia per C che per C++. – hvd