Для справки цитата из связанного вопроса в 14.3.1 / 2:
Локальный тип, тип без связи,
безымянный тип или составной тип
от любого из этих типов не должно быть
используется в качестве аргумента шаблона для
параметр типа шаблона.
Моя интерпретация заключается в том, что typedef struct
создает псевдоним для безымянного типа и, таким образом, его нельзя использовать в качестве параметра типа шаблона. Также отметим, что дополнительно в C typedef struct {} Foo;
трактуется несколько иначе, чем в struct Foo {};
, что дает прецедент того, что эти две формы не эквивалентны (хотя, по общему признанию, в C ++ разницы нет).
Таким образом, может показаться, что ваш первый пример работает (поскольку он не использует безымянный тип в качестве параметра типа шаблона), тогда как второй и третий примеры будут технически недопустимыми (поскольку они используют его как параметр типа шаблона).
Наконец, в заключение я должен спросить, есть ли причина, по которой вы не можете назвать структуру вместо typedef
ее?
РЕДАКТИРОВАТЬ: от 7.1.3 / 1:
... Таким образом, typedef-name является синонимом
другой тип. Typedef-имя не
ввести новый тип, как класс
декларация (9.1) или перечисление enum
делает ...
Это строго подразумевает, что использование typedef
таким способом не вводит тип, подходящий для использования в качестве параметра типа шаблона.