Я хочу реализовать метод подкачки в моем классе, используя шаблонную подкачку

#c

#c

Вопрос:

У меня есть класс только с одним членом, который является вектором.

 class myClass{
private:
    vector<double> vector_member;
public:
    method1();
    method2();
    ...
}
 

Я хочу реализовать метод подкачки в этом классе с шаблонной подкачкой.
Прямо сейчас я изучаю идиому copy-swap, метод swap используется для помощи с operator = .
Чего я хочу добиться, так это чего-то подобного:

 void Polynomial :: swap(Polynomialamp; p){
    std::swap(this.vector_member, p.vector_member)
}
 

Я читал о «подкачке» здесь, swap Cplusplus.com , в начале он говорит:
Поведение этого шаблона функции std::swap эквивалентно:

 template <class T> void swap ( Tamp; a, Tamp; b )
{
  T c(a); a=b; b=c;
}
 

Но почему я не могу использовать его в своем методе? Или я здесь что-то недопонимаю?

Комментарии:

1. Вы включили algorithm ?

2. @DaniloIvanovic На самом деле это <utility> с C 11.

3. Обратите внимание, cppreference.com это гораздо лучшая ссылка.

4. @tadman Спасибо. Намного лучше.

5. this.vector_member должно быть this->vector_member .

Ответ №1:

Вероятно, вам не хватает #include файла заголовка for, который std::swap() определен в.

До C 11, std::swap() находится внутри <algorithm> . В C 11 и более поздних версиях он находится <utility> вместо этого.

 #include <utility> // or <algorithm>

void Polynomial :: swap(Polynomialamp; p){
    std::swap(vector_member, p.vector_member);
}
 

При этом, как говорится, std::vector имеет свой собственный swap() метод. std::swap() просто специализирован для std::vector вызова std::vector::swap() , поэтому вы можете просто вызвать его напрямую самостоятельно и std::swap вообще не использовать:

 void Polynomial::swap(Polynomialamp; p){
    vector_member.swap(p.vector_member);
}
 

Комментарии:

1. Преимущество использования using std::swap;swap(vector_member, p.vector_member); заключается в том, что при изменении типа vector_member он все равно должен работать без необходимости изменения какого-либо кода. vector_member.swap() Прямое использование означает, что вам нужно вручную исправить вызов при изменении типа, а у нового типа нет swap() метода.