Ответ 1
Вы не можете перегружать функции в пространстве имен std.
Объявить swap как свободную функцию, перегруженную в том же пространстве имен, что и ваш класс C
:
template<class T>
void swap(C<T>& x, C<T>& y) { x.swap(y); }
Правильный способ обмена - импортировать std:: swap и использовать неквалифицированную версию (которая возвращается через поиск Koenig на основе пространства имен):
template<class T>
void dostuff(T x, T y) {
...
using std::swap;
swap(x,y);
...
}
Это будет использовать C:: swap, если x и C, и std:: swap для типов, у которых нет собственного свопа.
(Импорт std:: swap, как указано выше, необходим только в функциях шаблона, где тип неизвестен. Если вы знаете, что у вас есть C, вы можете сразу использовать x.swap(y) без проблем.)