Не удается получить доступ к глобальной функции Swap из класса

это мой первый вопрос на сайте.

Небольшая проблема встретила меня сегодня. Я не могу вызвать глобальную функцию Swap внутри оператора присваивания и перемещения конструктора из класса шаблона DynamicArray. Когда я пытаюсь сделать это, я получаю ошибку C2660, говорящую:

'DynamicArray<int>::Swap' : function does not take 2 arguments.

Это странно для меня, потому что я могу вызвать эту функцию с двумя аргументами в основной функции. Кто-нибудь знает, что является причиной этого?

#include <iostream>
#include <stdexcept>

using std::cout;
using std::cin;
using std::endl;

template <typename T>
class DynamicArray;

template <typename T>
inline void Swap(DynamicArray<T>& lhs, DynamicArray<T>& rhs) {

lhs.Swap(rhs);
}

template <typename T>
class DynamicArray {

public:
DynamicArray(size_t Size = 0, T Content = T())
: m_Size(Size), m_Array(Size ? new T[m_Size] : nullptr) {

for (size_t i = 0; i < m_Size; ++i) {

m_Array[i] = Content;
}
}

DynamicArray(const DynamicArray<T>& rhs)
: m_Size(rhs.m_Size), m_Array(m_Size ? new T[m_Size] : nullptr) {

std::copy(rhs.m_Array, rhs.m_Array + m_Size, m_Array);
}

DynamicArray(DynamicArray<T>&& rhs)
: DynamicArray<T>() {

this->Swap(rhs);
//Swap(*this, rhs);         //C2660
}

DynamicArray<T>& operator= (DynamicArray<T> rhs) {

this->Swap(rhs);
//Swap(*this, rhs);         //C2660

return *this;
}

~DynamicArray() {

delete [] m_Array;
}

void Swap(DynamicArray<T>& rhs) {

std::swap(m_Size, rhs.m_Size);
std::swap(m_Array, rhs.m_Array);
}

private:
size_t m_Size;
T* m_Array;
};

int main() {

DynamicArray<int> DA1(4, 64);
DynamicArray<int> DA2(2, 33);

DA1 = std::move(DA2);     //using move constructor

DynamicArray<int> DA3(8, 4);
DynamicArray<int> DA4(2, 55);

DA3 = DA4;                //using assignment operator

Swap(DA1, DA3);           //here I can call this function with 2 arguments

cout << endl;
system("pause");
}

0

Решение

Чтобы указать, что вы хотите вызвать глобальный своп, вы должны префикс его, возможно, с оператором разрешения области ::, как это ::Swap(...),

Прошло много времени с тех пор, как я последний раз кодировал на c ++, но я считаю, что метод Swap-члена имеет преимущество в разрешении символа Swap, когда он используется в методе-члене.

3

Другие решения

Чтобы явно использовать функцию std :: swap, попробуйте:

void Swap(DynamicArray<T>& rhs)
{
using std::swap;
std::swap(m_Size, rhs.m_Size);
std::swap(m_Array, rhs.m_Array);
}

DynamicArray(DynamicArray<T>&& rhs)
: DynamicArray<T>()
{
this->Swap(rhs);
}
...
Swap<int>( DA1, DA3 );

но я бы удалил глобальный inline void Swap(DynamicArray<T> и начать использовать:

DA1.Swap( DA3 );
0

По вопросам рекламы ammmcru@yandex.ru