如何为引用(代理)类实现重载的复制赋值运算符?

时间:2015-04-09 23:24:08

标签: c++ reference proxy operator-overloading bitarray

作为一个赋值,我必须创建一个模板位数组类,​​其中一部分是重载索引运算符。我们被告知要使用代理类,并给出一个示例代码:

class Bits {
...
    class reference {
        Bits& b;
        int pos;
    public:
        reference(Bits& bs, int p) : b(bs) {
            pos = p;
        }
        reference& operator=(bool bit) {
            // Set the bit in position pos to true or false, per bit
            if (bit)
                b.data |= (1u << pos);
            else
                b.data &= ~(1u << pos);
            return *this;
        }
        operator bool () const {
            // Return true or false per the bit in position pos
            return b.data & (1u << pos);
        }
    };
    reference operator[](int pos) {
        return reference(*this, pos);
    }

我的代码如下所示(改为适合位数组):

template <class IType = size_t>
class BitArray {
...
    class bitproxy {
        BitArray& b;
        size_t pos;
    public:
        bitproxy(BitArray& ba, size_t p) : b(ba) {
            pos = p;
        }
        bitproxy& operator=(bool bit) {
            b.assign_bit(pos, bit);
            return *this;
        }
        operator bool() const {
            return b.read_bit(pos);
        }
    };

    bitproxy operator[](size_t bitpos) {
        if (bitpos >= arrSize)
            throw logic_error("Provided index is out of range");
        else
            return bitproxy(*this, bitpos);
    }
    bool operator[](size_t pos) const {
        if (pos >= arrSize)
            throw logic_error("Provided index is out of range");
        else
            return read_bit(pos);
    }

当我在Visual Studio中运行时,我的代码完美运行并传递所有测试(tbitarray.cpp文件),但是当我在Mac上运行g ++时,它无法正常工作。相反,它会出现此错误消息:

tbitarray.cpp:141:17: error: object of type 'BitArray<unsigned long>::bitproxy'
      cannot be assigned because its copy assignment operator is implicitly
      deleted
        b9[0] = b10[0] = b10[1];
                       ^
./BitArray.h:166:13: note: copy assignment operator of 'bitproxy' is implicitly
      deleted because field 'b' is of reference type 'BitArray<unsigned long> &'
                BitArray& b;
                          ^

参考示例代码在我的窗口或Mac上编译并运行时没有任何问题。

我理解为什么隐式删除了复制作业,但我不明白为什么示例代码有效(当它采用相同的基本格式时)以及为什么我的代码会在Windows机器,但不是基于unix的机器。

我不确定从哪里开始,我已经尝试过所有事情。是否有某种解决方法?

0 个答案:

没有答案