Объявление друга специализации шаблона терпит неудачу

Следующий код, содержащий объявление друга, завершается неудачно с указанной ошибкой (см. http://ideone.com/Kq5dy ):

template void foo() {}

template
class A {
   void foo();
   friend void foo(); // error: variable or field 'foo' declared void
};

int main()
{
   foo();
}

Если порядок объявления друга и объявления функции-члена поменялся местами, тогда код компилируется без проблем (см. http://ideone.com/y3hiK ):

template void foo() {}

template
class A {
   friend void foo();
   void foo();
};

int main()
{
   foo();
}

Этого не происходит, если объявление друга не содержит специализации шаблона: друзья, не являющиеся шаблонами, в порядке , а также шаблон друзей. Также использование квалифицированного имени в специализации шаблона позволяет компилировать код. У меня вопрос: почему первый пример терпит неудачу? Кажется, компилятор ищет имена в области класса в точке объявления друга и только для специализации шаблона? Где в Стандарте указано такое поведение?

8
задан curiousguy 23 December 2011 в 07:22
поделиться