Следующий код, содержащий объявление друга, завершается неудачно с указанной ошибкой (см. 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();
}
Этого не происходит, если объявление друга не содержит специализации шаблона: друзья, не являющиеся шаблонами, в порядке , а также шаблон друзей. Также использование квалифицированного имени в специализации шаблона позволяет компилировать код. У меня вопрос: почему первый пример терпит неудачу? Кажется, компилятор ищет имена в области класса в точке объявления друга и только для специализации шаблона? Где в Стандарте указано такое поведение?