As [class.friend]/5 says :
When a friend declaration refers to an overloaded name or operator, only the function specified by the parameter types becomes a friend. A member function of a class X can be a friend of a class Y.
In your specific case :
#include <iostream>
#include <vector>
struct Screen;
class Window_mgr
{
public:
Window_mgr();
using ScreenIndex = std::vector<Screen>::size_type;
void clear(ScreenIndex);
private:
std::vector<Screen> screens;
};
class Screen
{
friend void Window_mgr::clear(ScreenIndex);
public:
using pos = std::string::size_type;
Screen(pos ht, pos wd, char c) : height(ht), width(wd), contents(ht * wd, c) { }
private:
pos height = 0, width = 0;
std::string contents;
};
Window_mgr::Window_mgr():
screens{1, Screen(24, 80, ' ') }
{
}
void Window_mgr::clear(ScreenIndex i)
{
Screen &s = screens[i];
s.contents = std::string(s.height * s.width, ' ');
}
int main()
{
Window_mgr w;
w.clear(0);
}
Take a note that it is not possible to solve that exercise, because Window_mgr has a member variable of std::vector which argument is an incomplete type. It will work on most compilers (see here why), but the standard prohibits it.
This example demonstrates how to make a member function friend of a class :
#include <iostream>
struct A;
struct B
{
void bar( A& a, int l);
};
struct A
{
friend void B::bar(A&,int);
A():k(0){}
private:
void foo(int m);
int k;
};
void A::foo(int m)
{
std::cout<<"A::foo() changing from "<<k<<" to "<<m<<std::endl;
k=m;
}
void B::bar( A& a, int l)
{
std::cout<<"B::bar() changing to "<<l<<std::endl;
a.foo(l);
}
int main()
{
A a;
B b;
b.bar(a,11);
}