yandex
loader

please wait

  • Jadav Payeng Mar-11-2019 12:40:31 PM ( 2 months ago )

    The following classes definitions declare a friend function providing an inline definition for it. I was trying to invoke the friend function from a class method with the same name of the friend function, but in order to make it work I have to access it from the enclosing namespace (which also requires a forward declaration, class C below). Why the name lookup works for class A and it doesn't work in class B? Note that the parameters of B::swap are different from those of its friend function.

    #include 
    
    struct A {
        A(int x) : v{ x } {}
        friend void swap(A& x, A& y) { std::swap(x.v, y.v); }
        void swapm(A& other) { swap(*this, other); }
    private:
        int v;
    };
    
    struct B {
        B(int x) : v{ x } {}
        friend void swap(B& x, B& y) { std::swap(x.v, y.v); }
        void swap(B& other) { swap(*this, other); } // <-- This doesn't compile
    private:
        int v;
    };
    
    struct C;
    void swap(C& x, C& y);
    struct C {
        C(int x) : v{ x } {}
        friend void swap(C& x, C& y) { std::swap(x.v, y.v); }
        void swap(C& other) { ::swap(*this, other); }
    private:
        int v;
    };
    
    int main()
    {
        A a1{ 1 }, a2{ 2 }; swap(a1, a2); a1.swapm(a2);
        B b1{ 3 }, b2{ 4 }; swap(b1, b2); b1.swap(b2);
        C c1{ 5 }, c2{ 6 }; swap(c1, c2); c1.swap(c2);
    }
  • Dipti Singh Mar-11-2019 12:42:03 PM ( 2 months ago )

    inline friend? Why not static in this case? And not friend? And then create a global one that calls the static. For me, this is a bad design more than an actual problem.

    The method swap should be the one doing the work instead of the friend (because no need for a friend anymore):

    struct C {
        C(int x) : v{ x } {}
        void swap(C& other) { std::swap(this->v, other.v); }
    private:
        int v;
    };
    
    void swap(C& x, C& y)
    {
      x.swap(y);    
    }

Please login

Similar Discussion

Recommended For You