Have a look at all the places where different symbols are output. That should give you a clue.
For example, the character '+' is written every time the constructor of the class is called (in line 13). Can you see why 3 2 of them are written when you run your program?
A '<' character is written every time the copy constructor is called. The copy constructor is called once at line 41, as you've probably realised.
But also, your swap function is defined to pass in the template objects by value. This means that the objects are copied into the function, so the copy constructor is called once when o1 is copied in, and once when o2 is copied in.
This also explains why the swap function is having no effect on the o1 and o2 objects in your main function. It's swapping the contents of the local copies inside the swap, not the objects of the same names in main.
If you want the function to swap the values of the objects in main, you'll need to pass them into swap by reference, not by value.