4

I have some (real world) code that has a structure basically like so:

class C
   {
   public:
      C(int x = 0) : m_x(x) {}
      friend int foo(const C& c, int y) { return c.m_x + y; }
   private:
      int m_x;
   };

class Z
   {
   public:
      int foo(int y) {
        // The problematic call:
        return foo(c, y);
      }
   private:
      C c;
   };

I understand that the call to foo inside Z::foo needs to be disambiguated. The thing I don't understand is, what scope is appropriate? I expected the declaration of the C-friend foo to be in the global namespace, but calling as ::foo does not work, both GCC and Clang report this as an error.

However, if I change the declaration of C+friend to:

class C
   {
   public:
      C(int x) : m_x(x) {}
      friend int foo(const C& c, int y);
   private:
      int m_x;
   };

   int foo(const C& c, int y) { return c.m_x + y; }

Everything works, I can (in Z::foo) refer to ::foo.

So here is my questions: in the first example, what scope is the C-friend foo in, if it is not in the global namespace? Is there no way to refer to the global foo from within Z::foo? And, what is the difference between my first and second examples?

Jack Lloyd
  • 8,215
  • 2
  • 37
  • 47

0 Answers0