如何从const通用对象复制?

时间:2012-11-01 10:44:24

标签: c++-cli const copy-constructor deep-copy

我正在研究一个通用的循环缓冲区,但是在复制构造函数方面遇到了绊脚石(参见下面的代码示例)。

using namespace System;

/// A generic circular buffer with a fixed-size internal buffer which allows the caller to push data onto the buffer, pop data back off again and provides direct indexed access to any element.
generic<typename T>
public ref class CircularBuffer
{
protected:
    array<T, 1>^ m_buffer; /// The internal buffer used to store the data.
    unsigned int m_resultsInBuffer; /// A counter which records the number of results currently held in the buffer
    T m_nullValue; /// The value used to represent a null value within the buffer

public:
    CircularBuffer(unsigned int size, T nullValue):
      m_buffer(gcnew array<T, 1>(size)),
      m_nullValue(nullValue),
      m_resultsInBuffer(0)
    {

    }

    /// <summary>
    /// Copy constructor
    /// </summary>
    CircularBuffer(const CircularBuffer^& rhs)
    {
        CopyObject(rhs);
    }

    /// <summary>
    /// Assignment operator.
    /// </summary>
    /// <param name="objectToCopy"> The Zph2CsvConverter object to assign from. </param>
    /// <returns> This Zph2CsvConverter object following the assignment. </returns>
    CircularBuffer% operator=(const CircularBuffer^& objectToCopy)
    {
        CopyObject(objectToCopy);
        return *this;
    }

protected:
    /// <summary>
    /// Copies the member variables from a Zph2CsvConverter object to this object.
    /// </summary>
    /// <param name="objectToBeCopied"> The Zph2CsvConverter to be copied. </param>
    void CopyObject(const CircularBuffer^& objectToBeCopied)
    {
        m_buffer = safe_cast<array<T, 1>^>(objectToBeCopied->m_buffer->Clone());
        m_nullValue = objectToBeCopied->m_nullValue; // <-- "error C2440: '=' : cannot convert from 'const T' to 'T'"
        m_resultsInBuffer = objectToBeCopied->m_resultsInBuffer;
    }
};

编译这会给我error C2440: '=' : cannot convert from 'const T' to 'T'

通常我会在我自己的ref类中使用它,其中包括指向托管和非托管内存的指针,因此如果重复整个缓冲区,则需要深度复制缓冲区的内容。

我在这里缺少什么?为什么我无法将const T类型的内容复制到T类型的某些内容?

1 个答案:

答案 0 :(得分:1)

“C ++ / CLI的持续传奇中的另一个条目支持const”。

C ++ / CLI中的复制构造函数是T(T%)。赋值运算符是T%operator =(T%)。没有const而且没有参考。

查看它们的好地方是vc / include / cliext,它是STL / CLR实现类的主页。不要使用它们。