Вы можете использовать ссылочную переменную шаблона следующим образом:
Соответствующий plunkr находится здесь https://plnkr.co/edit/JB4HY0oxEUgXXIht2wAv?p=preview
См. Предыдущий ответ на связанный вопрос. Это длинная цитата из статьи Дэна Сакса, которая объясняет эту проблему так же ясно, как и все, что я встречал:
Разница между 'struct' и 'typedef struct' в C ++?
Этот метод может предотвратить реальные проблемы (хотя, по общему признанию, редкие проблемы).
Это дешевый элемент страховки - нулевые затраты во время выполнения или в пространстве кода (единственная стоимость - несколько байтов в исходном файле ), но получаемая вами защита настолько мала, что редко можно увидеть, как кто-то ее использует постоянно. У меня есть фрагмент «нового класса», который включает typedef, но если я на самом деле кодирую класс с нуля без использования фрагмента, я почти никогда не утруждаюсь (или помню?), Чтобы добавить typedef.
Итак, я Я бы сказал, что не согласен с большинством приведенных здесь мнений - стоит добавить эти typedef, но недостаточно, чтобы я огорчил кого-либо (включая себя) из-за того, что не вставил их.
Меня попросили пример того, как не иметь имени класса typedef '
Это предотвращает компиляцию такого кода:
class SomeClass { ... };
int SomeClass;
Это совершенно законный C ++, хотя он ужасный . Если вы это сделаете, то любые ссылки на чистый SomeClass
будут относиться к переменной. Чтобы обратиться к классу, вам нужно явно указать class SomeClass
при каждом использовании. Если вы создаете typedef
:
class SomeClass { ... };
typedef class SomeClass SomeClass;
int SomeClass;
, то компилятор помечает определение int SomeClass
как ошибку, как и должно быть.
Мне кажется, что ваш коллега, возможно, не полностью закончил C.
В C, если вы объявите struct foo {int a;};
, у вас нет ничего, что можно было бы вызвать только foo
, а скорее struct foo
. Поэтому довольно часто typedef struct foo
as foo
.
Это было изменено в C ++ по причинам, которые должны быть довольно очевидными.
Адам указал верную причину для этого, но по поводу вашего вопроса «Стоит ли беспокоиться?» Я бы ответил решительным «Нет!». Возможный код проблемы:
class SomeClass { ... };
int SomeClass;
будет обнаружен, когда немного позже кто-то скажет:
SomeClass sc;
По общему признанию компилятор укажет на «неправильную» строку, но такие вещи случаются так редко (не думаю, что я ' я когда-либо видел это в реальном коде), что он не может оправдать целый лес почти лишних определений типов.
Похоже, комментарий пытается сказать, что typedef делает символ SomeClass глобальным таким образом, чтобы никто не мог объявить локальный объект с тем же именем, который скрывает исходный SomeClass .
Я пробовал это с VC6 (это не настоящий компилятор C ++, который я знаю, но лучший из тех, что у меня есть ATM), и, похоже, он мало что дает. SomeClass по-прежнему скрывается локальным объявлением с тем же именем. Возможно, он изменяет содержание сообщения об ошибке для какого-то компилятора, чтобы сделать его более полезным.
Я понимаю концепцию разные пространства имен, которые помечают и идентификаторы живут, но это действительно даже стоит того печатаете?
Нет.
Either really broken compiler or someone not knowing what they do, or so I would think.