【问题标题】:Can't access global Swap function within from a class无法从类中访问全局交换功能
【发布时间】: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&lt;int&gt;(DA1, DA3); 貌似T不能自动从DynamicArray&lt;int&gt;推导出来。
  • 通过姓名查找只找到了一位候选人,那就是您班上的候选人。如果已找到外部范围,则不搜索外部范围。因此,您必须对其进行限定或将其纳入范围。
  • 看起来 DynamicArray 定义了自己的 Swap 函数,它会影响全局函数。试试::Swap(*this,rhs)

标签: c++ constructor variable-assignment swap


【解决方案1】:

要指定要调用全局 Swap,您应该在其前面加上范围解析运算符 ::,例如 ::Swap(...)

自从我上次用 c++ 编码以来已经有很长一段时间了,但我相信当在成员方法中使用成员 Swap 方法时,它在 Swap 符号的解析中具有优先权。

【讨论】:

    【解决方案2】:

    要显式使用 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&lt;T&gt; 并开始使用:

    DA1.Swap( DA3 );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多