шаблон функции не может скрыть имя класса? - PullRequest
4 голосов
/ 23 апреля 2011

Это работает в 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) может быть скрыто по имени переменной, члена данных, функции или перечислителя, объявленного вта же сфераЕсли имя класса или перечисления и переменная, член данных, функция или перечислитель объявляются в одной и той же области (в любом порядке) с одинаковым именем, имя класса или перечисления скрывается везде, где переменная, член данных, функция илиимя перечислителя видно.

1 Ответ

4 голосов
/ 24 апреля 2011

Это потому, что спецификация говорит в 14.p5:

Шаблон класса не должен иметь того же имени, что и любой другой шаблон, класс, функция, переменная, перечисление, перечислитель, пространство имен или типв том же объеме (3.3), за исключением случаев, указанных в (14.5.5).За исключением того, что шаблон функции может быть перегружен либо (не шаблонными) функциями с тем же именем, либо другими шаблонами функций с тем же именем (14.8.3), имя шаблона, объявленное в области пространства имен или в области класса, должно быть уникальным вэта сфера.

...