Это работает в GCC и Comeau:
struct X {};
void X() {}
Это разрывается в Comeau:
struct X {};
template< typename T >
void X() {}
Это прерывает оба:
template< typename T >
struct X {};
template< typename T >
void X() {}
Правило определеносогласно §3.3.7 / 2.Это несоответствие просто потому, что шаблон функции не является функцией?Я не могу понять поведение GCC.
Имя класса (9.1) или имя перечисления (7.2) может быть скрыто по имени переменной, члена данных, функции или перечислителя, объявленного вта же сфераЕсли имя класса или перечисления и переменная, член данных, функция или перечислитель объявляются в одной и той же области (в любом порядке) с одинаковым именем, имя класса или перечисления скрывается везде, где переменная, член данных, функция илиимя перечислителя видно.