作为一个赋值,我必须创建一个模板位数组类,其中一部分是重载索引运算符。我们被告知要使用代理类,并给出一个示例代码:
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的机器。
我不确定从哪里开始,我已经尝试过所有事情。是否有某种解决方法?