https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78330
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- I suspect that GCC and Clang simply forget the names of the template-parameter-list <class T> as soon as it's been parsed, because those names have no purpose and can't be referred to outside that template-parameter-list anyway. But strictly speaking, ICC is right that the names are still in scope and so collide with the template's own name.