私は一般的な循環バッファーに取り組んでいますが、コピー コンストラクターに関してはつまずきがあります (以下のコード例を参照)。
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
ですか?