В качестве задания я должен создать шаблонный массив битовых массивов, и его часть перегружает оператор индекса. Нам сказали использовать прокси-класс, и нам дали пример кода для:
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);
}
Мой код работает отлично и проходит все тесты (файл tbitarray.cpp), когда я запускаю его в Visual Studio, но не работает, когда я запускаю его через g ++ на моем Mac. Вместо этого появляется следующее сообщение об ошибке:
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 машина.
Я не совсем уверен, куда идти отсюда, и я попробовал почти все. Есть ли какое-то решение для этого?
Задача ещё не решена.