Чтобы было ясно, что именно этой функцией вы хотите быть - friend добавьте к имени функции ::, чтобы указать, что она находится в глобальном пространстве имен.
Фрагмент, который компилируется и делает то, что вы хотите:
template<class T> void foo() {}
template<typename T>
class A {
void foo();
friend void ::foo<T>();
};
int main()
{
foo<int>();
}
3.4 / 9 Поиск имени
Поиск имени для имени, используемого в определении функции друга (11.4), определенной встроенным в класс, предоставляющий дружбу, должен выполняться, как описано для поиска в определениях функций-членов. Если функция друга не определена в классе, предоставляющем дружбу, поиск имени в определении функции друга должен выполняться, как описано для поиска в определениях функций-членов пространства имен.
Ваш фрагмент не может быть скомпилирован по той же причине, что и приведенный ниже код.
template<class T> void foo () {}
template<typename T>
struct A {
void foo ();
void func () {
foo<T> (); // when performing the name lookup A::foo is
// found before ::foo<T>
}
};
...
14.5.3 Друзья [temp.friend] 1
Другом класса или шаблона класса может быть шаблон функции или шаблон класса, специализация шаблона функции или шаблона класса, или обычная (не шаблонная) функция или класс. Для объявления дружественной функции, не являющейся объявлением шаблона:
- если имя друга является квалифицированным или некорректным идентификатором шаблона, объявление друга относится к специализации шаблона функции, в противном случае
- если имя друга является квалифицированным идентификатором и соответствующая функция, не являющаяся шаблоном, найдена в указанном классе или пространстве имен, объявление друга ссылается на эту функцию, в противном случае,
- если имя друга является квалифицированным идентификатором и соответствующая специализация шаблона функции найдена в указанном классе или пространстве имен, объявление друга относится к этой специализации шаблона функции, в противном случае,
- имя должно быть неквалифицированным идентификатором, который объявляет (или повторно объявляет) обычную (не шаблонную) функцию.
person
Filip Roséen - refp
schedule
15.12.2011