С практической точки зрения, я понимаю, что оба typedef
и test
несколько «лишние» и должны быть удалены, если мы хотим, чтобы следующий код для компиляции:Почему шаблоны typedef незаконны?
template< typename type_t >
typedef struct tagTest
{
int a;
} test;
Однако, я думал, что множество Объявление typedef было подмножеством набора объявлений. У них только что был этот специфический decl-specifier. Это была моя рационализация для
typedef struct tagTest
{
int a;
} test;
представляя идентификатора test
и объявить структуру tagTest
. Если эта интерпретация верна, то следующий абзац из стандарта должен позволять template
typedef
(хотя и не со значением, задаваемым ключевым словом using
).
декларация в матричной декларации, - (1.1) объявить или определить функцию, класс, или переменную, или - (1.2) определить функцию-член, класс член , член перечисления, или статический член данных шаблона класса или класса вложен в шаблоне класса или - (1.3) определить шаблон члена шаблона класса или класса, или - (1.4) быть объявлением псевдонима.
Я не вижу ошибки в своих рассуждениях, но заключение является незаконным.
Каковы соответствующие части стандарта, которые разрешают вышеупомянутую головоломку?
UPDATE Часть вышеприведенных рассуждений использует тот факт, что typedef
struct
объявляющий структуру. Спецификатор typedef
, насколько я понимаю, подразумевает, что любые объявленные переменные действительно являются типами. То есть typedef
обновляет test
от простой переменной до типа, эквивалентного объявленному tagTest
. Вот почему следующий код компилируется (хотя и с предупреждением).
typedef struct tagTest
{
int a;
};
tagTest t;
Один из ответов заботится о избыточном test
.Но, можно использовать ЬурейеЕ без описателя because «Init-описатель-лист не является обязательным при объявлении имени класса/структуры/объединения или именованный перечисление»
Er ... Ни один из этих случаев не закрывает его. Тот факт, что в декларации содержится что-то, объявляющее класс, не означает, что само объявление объявляет класс. Декларация просто определяет тип. – hvd
@hvd В C, typedef, содержащий помеченную структуру, объявляет эту структуру, а также определяет имя, которое его псевдонизирует. Вы говорите, что C++ отличается в этом отношении? – davmac
@ davmac Нет, мы согласны с окончательным результатом такой декларации. Я говорю, что часть, которая заставляет объявлять структуру, - это не сама декларация, а только подкомпонент этого объявления. И это относится как к C, так и к C++. – hvd