17 Templates [temp]

17.6 Name resolution [temp.res]

17.6.5 Friend names declared within a class template [temp.inject]

Дружественные классы или функции могут быть объявлены в шаблоне класса. Когда создается экземпляр шаблона, имена его друзей обрабатываются так, как если бы специализация была явно объявлена ​​в точке создания экземпляра.

Как и в случае с классами, не являющимися шаблонами, имена дружественных функций области видимости пространства имен специализации шаблона класса не видны во время обычного поиска, если явно не объявлены в области видимости пространства имен ([class.friend]). Такие имена можно найти в правилах для связанных классов ([basic.lookup.argdep]).140 [Example:

template<typename T> struct number {
  number(int);
  friend number gcd(number x, number y) { return 0; };
};

void g() {
  number<double> a(3), b(4);
  a = gcd(a,b);     // finds gcd because number<double> is an associated class,
                    // making gcd visible in its namespace (global scope)
  b = gcd(3,4);     // ill-formed; gcd is not visible
}

end example]

Объявления друзей не вводят новые имена ни в какую область видимости ни при объявлении шаблона, ни при его создании.