0

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

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ですか?

4

1 に答える 1

1

「C++/CLI は実際にはconst をサポートしていない」という話の続きです。

C++/CLI のコピー コンストラクターは T(T%) です。代入演算子は T% operator=(T%) です。const も ref もありません。

STL/CLR 実装クラスのホームである vc/include/cliext は、それらの使用を確認するのに適した場所です。それらを使用しないでください。

于 2012-11-01T13:08:38.627 に答える