#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()
метода.