Search code examples
c++namespacesfriend

class friend function inside a namespace


Im trying to define a class friend function outside the namespace like this:

namespace A 
{
class window 
{
    private:
    int a;
    friend void f(window);
};
}

void f(A::window rhs)
{
    cout << rhs.a << endl;
}

Im getting an error said that there is ambiguity. and there is two candidates void A::f(A::window); and void f(A::window). So my question is :

  1. How to make the global function void f(A::window rhs) a friend of the class A::window.

EDIT: (After reading the answers)

  1. why do I need to qualify the member function f inside window class to be global by doing ::f(window) ?

  2. why do I need to predeclare the function f(A::window) in this particular case, whereas when the class is not a defined inside a namespace it's okey for the function to be declared after the function is declared a friend.


Solution

  • As well as adding a :: you need to forward declare it, e.g.:

    namespace A { class window; }
    
    void f(A::window);
    
    namespace A{
      class window{
        private:
        int a;
        friend void ::f(window);
      };
    }
    
    void f(A::window rhs){
      std::cout << rhs.a << std::endl;
    }
    

    Note that for this forward declaration to work you need to forward declare the class too!