【发布时间】:2014-06-29 13:48:31
【问题描述】:
这是我在网站上的第一个问题。
今天遇到了一个小问题。我无法在赋值运算符中调用全局函数 Swap 并从 DynamicArray 模板类中移动构造函数。当我尝试这样做时,我收到一个错误 C2660 说:
'DynamicArray<int>::Swap' : function does not take 2 arguments.
这对我来说很奇怪,因为我可以在主函数中使用 2 个参数调用这个函数。有谁知道这是什么原因?
#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");
}
【问题讨论】:
-
试试
Swap<int>(DA1, DA3);貌似T不能自动从DynamicArray<int>推导出来。 -
通过姓名查找只找到了一位候选人,那就是您班上的候选人。如果已找到外部范围,则不搜索外部范围。因此,您必须对其进行限定或将其纳入范围。
-
看起来
DynamicArray定义了自己的Swap函数,它会影响全局函数。试试::Swap(*this,rhs)。
标签: c++ constructor variable-assignment swap