Search code examples
c++friendfriend-function

C++ friend function hidden by class function?


Minimal example:

class A
{
    friend void swap(A& first, A& second) {}
    void swap(A& other) {}
    void call_swap(A& other)
    {
        swap(*this, other);
    }
};

int main() { return 0; }

g++ 4.7 says:

friend.cpp: In member function ‘void A::call_swap(A&)’:
friend.cpp:7:20: error: no matching function for call to ‘A::swap(A&, A&)’
friend.cpp:7:20: note: candidate is:
friend.cpp:4:7: note: void A::swap(A&)
friend.cpp:4:7: note:   candidate expects 1 argument, 2 provided

Outcomment line 4:

// void swap(A& other) {}

...and it works fine. Why, and how to fix this, if I want to keep both variants of my swap function?


Solution

  • I believe it is because the compiler is trying to find the function within the class. This should be a minimalistic change to make it work (it works in Visual Studio 2012):

    class A; // this and the next line are not needed in VS2012, but
    void swap(A& first, A& second); // will make the code compile in g++ and clang++
    
    class A
    {
        friend void swap(A& first, A& second) {}
        void swap(A& other) {}
        void call_swap(A& other)
        {
            ::swap(*this, other); // note the scope operator
        }
    };
    
    int main() { return 0; }