В целом, C++ необходимо typename
из-за неудачного синтаксиса [*] он наследуется от C, что делает его невозможно без нелокальной информации сказать - к примеру - в A * B;
будь A
именует типа (в которых case это объявление B
как указатель на него) или нет (в этом случае это выражение умножения - вполне возможно с A
, поскольку все, что вы можете сказать без нелокальной информации, может быть экземпляром класса, который перегружает operator*
, чтобы сделать что-то странное ;-).
В большинстве случаев у компилятора есть нелокальная информация, необходимая для устранения неоднозначности (хотя неудачный синтаксис по-прежнему означает, что низкоуровневому парсеру нужна обратная связь с уровня более высокого уровня, который хранит информацию в таблице символов) ... но с шаблонами это не так (не в общем, хотя в этом конкретном случае было бы технически незаконным специализировать std::list<T>
, так что его ::iterator
НЕ является именем типа ;-).
[*] не только мое мнение, но и мнение Кен Томпсона и Роба Пайкса, в настоящее время моих коллег, которые заняты разработкой и внедрением нового языка программирования для внутреннего использования: этот новый язык программирования, а его синтаксис - в основном C-like, НЕ повторяет ошибки дизайна синтаксиса C - это новый язык (например, в хорошем старом Pascal), синтаксиса достаточно, чтобы отличать идентификаторы, которые должны называть тип из тех, которые не должны ;-).
Возможно, отредактируйте, чтобы уточнить, что строка, о которой вы говорите, является typename std :: list :: iterator it = std :: find (rep.begin(), rep.end(), itme); поскольку я думаю, что это ваше намерение. –
aem