Как написать оператор присваивания для этого случая?

У меня есть некоторый код, который прекрасно скомпилирован на MSVC, но теперь я портирую его на Clang и испытываю проблемы с написанием оператора присваивания, который, как я предполагаю, был принят как неявный в MSVC. Вот код, который я получил:

enum EBufferPacking {
Invalid = -1, UInt1, Int8, Int16, Float32
};

template<EBufferPacking p>
class PackedBufferRef;

template<>
class PackedBufferRef<UInt1> {
unsigned char *const m_pBuffer;
const unsigned char m_nMask;
public:
explicit PackedBufferRef<UInt1>(void *buffer, int offset):
m_pBuffer((unsigned char *)buffer + offset/8),
m_nMask(1<<(offset%8))
{}

operator float() const
{
return (*m_pBuffer & m_nMask) ? 1.0f : 0.0f;
}

template<class T>
PackedBufferRef<UInt1> &operator =(const T &t)
{
if (!t) // write 0
*m_pBuffer &= ~m_nMask;
else
*m_pBuffer |=  m_nMask;
return *this;
}
PackedBufferRef<UInt1> &operator =(const PackedBufferRef<UInt1> &ref)
{
if( !(*ref.m_pBuffer & ref.m_nMask) )
*m_pBuffer &= ~m_nMask;
else
*m_pBuffer |=  m_nMask;
return *this;
}
};template<class T>
class BytePackedBufferRef{
protected:
T *const m_pBuffer; // dont assign new pointers
BytePackedBufferRef<T>(void *buffer, int offset): m_pBuffer((T *)buffer + offset) {}

BytePackedBufferRef &operator=(const BytePackedBufferRef &other) {
// assignment operator should go here
}
public:
operator T*() const { return m_pBuffer; }
operator T() const { return *m_pBuffer; }
};

template<>
class PackedBufferRef<Float32>:public BytePackedBufferRef<float> {
public:
explicit PackedBufferRef<Float32>(void *buffer, int offset):BytePackedBufferRef<float>(buffer, offset) {}
template<class T> PackedBufferRef<Float32> &operator =(const T &t) { *m_pBuffer = (float)t; return *this; }
};

int main()
{
float fx = 0.5f;
float fy = 1.7f;

PackedBufferRef<Float32> firstRef(&fx, 0);
PackedBufferRef<Float32> secondRef(&fy, 0);

firstRef = secondRef;

printf("First ref: %.2f\n", (float)firstRef);
printf("Second ref: %.2f\n", (float)secondRef);

return 0;
}

Из основной функции вы можете увидеть результат, к которому я стремлюсь: я хочу взять m_pBuffer из переменной на RHS присвоения, и положить его в m_pBuffer на переменной LHS. Специализация PackedBufferRef имеет оператор присваивания, который делает это, но просто передает присвоение до BytePackedBufferRef тип, чей m_pBuffer член объявлен конст. Как я могу написать оператор присваивания в этом случае?

0

Решение

Если вы настаиваете, вы можете сделать это так …

BytePackedBufferRef &operator=(const BytePackedBufferRef &other) {
// assignment operator should go here
T** pp = (T**)&m_pBuffer;
*pp = other.m_pBuffer;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector