C++ cli 如何从常量泛型对象复制?

C++ cli 如何从常量泛型对象复制?,c++-cli,constants,copy-constructor,deep-copy,C++ Cli,Constants,Copy Constructor,Deep Copy,我正在开发一个通用的循环缓冲区,但在复制构造函数方面遇到了一个障碍(请参见下面的代码示例) 使用名称空间系统; ///一种通用循环缓冲区,具有固定大小的内部缓冲区,允许调用者将数据推送到缓冲区,再次弹出数据并提供对任何元素的直接索引访问。 通用的 公共参考类循环缓冲 { 受保护的: 数组^m_buffer;///用于存储数据的内部缓冲区。 unsigned int m_resultsInBuffer;///一个计数器,记录缓冲区中当前保存的结果数 T m_nullValue;///用于表示缓冲区

我正在开发一个通用的循环缓冲区,但在复制构造函数方面遇到了一个障碍(请参见下面的代码示例)

使用名称空间系统;
///一种通用循环缓冲区,具有固定大小的内部缓冲区,允许调用者将数据推送到缓冲区,再次弹出数据并提供对任何元素的直接索引访问。
通用的
公共参考类循环缓冲
{
受保护的:
数组^m_buffer;///用于存储数据的内部缓冲区。
unsigned int m_resultsInBuffer;///一个计数器,记录缓冲区中当前保存的结果数
T m_nullValue;///用于表示缓冲区中的空值的值
公众:
CircularBuffer(无符号整数大小,T空值):
m_缓冲区(新阵列(大小)),
m_nullValue(nullValue),
m_结果缓冲区(0)
{
}
/// 
///复制构造函数
/// 
循环缓冲区(常量循环缓冲区^&rhs)
{
CopyObject(rhs);
}
/// 
///赋值运算符。
/// 
///要从中指定的Zph2CsvConverter对象。
///此Zph2CsvConverter对象在赋值之后。
CircularBuffer%运算符=(常量CircularBuffer^&对象复制)
{
CopyObject(objectToCopy);
归还*这个;
}
受保护的:
/// 
///将成员变量从Zph2CsvConverter对象复制到此对象。
/// 
///要复制的Zph2CsvConverter。
void CopyObject(const CircularBuffer^&objectToBeCopied)
{
m_buffer=safe_cast(objectToBeCopied->m_buffer->Clone());
m_nullValue=objectToBeCopied->m_nullValue;//m_resultsInBuffer;
}
};
编译此代码时出现错误C2440:“=”:无法从“const T”转换为“T”

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


我错过了什么?为什么我不能从类型为
const t
的东西复制到类型为
t
的东西?

连续不断的“C++/CLI不真正支持const”中的另一个条目

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


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

不要使用常量,不要使用ref或两者都不要使用?你说的'const^&`应该是
%
?对于引用类型是^%,对于值类型或泛型是%。非常简单。谢谢和往常一样,汉斯开始了救援:)
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;
    }
};