2012-11-14 52 views
0

我已经有了一些编译好的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; 
} 

从主要功能,你可以看到结果我去了:我想借此从转让的RHS的变量m_pBuffer,并把它进入LHS变量的m_pBuffer。 PackedBufferRef特化有一个赋值运算符,它可以完成这项工作,但只是将赋值传递给BytePackedBufferRef类型,其中m_pBuffer成员被声明为const。在这种情况下,我该如何写作业操作员?

+0

你要复制的指针或它的内容?如果你想复制指针,并且目的地是'const',恐怕你的运气不好。 – Angew

+0

用实际代码调用它的代码来判断(我只是为了演示目的在主函数中放了一个示例调用),我想说它只需要复制内容。 – benwad

回答

1

如果你坚持,你可以做这样的...

相关问题