使用模板重载运算符

Overloading Operators with templates

本文关键字:重载 运算符      更新时间:2023-10-16

因此,在使用模板时,我遇到了重载赋值运算符的问题。基本上,我采用了一个自定义的可调整大小的数组类,它由另一个缺乏调整大小能力的数组类继承。不管怎样,我有两个相等运算符,一个用于处理相同大小的数组,另一个用于在类型相同的情况下处理不同大小的数组。

这是操作员的代码:

// operator =
//
template <typename T, size_t N>
const Fixed_Array <T, N> & Fixed_Array <T, N>::operator = (const Fixed_Array <T, N> & rhs)
{
    for(size_t x = 0; x < N; x++)
    {
        this->set(x, rhs[x]);
    }
    return *this;
}
//
// operator =
//
template <typename T, size_t N>
template <size_t M>
const Fixed_Array <T, N> & Fixed_Array <T, N>::operator = (const Fixed_Array <T, M> & rhs)
{
    this->resize(M);
    for(size_t x = 0; x < M; x++)
    {
        this->set(x, rhs[x]);
    }
    return *this;
}

下面是我用来创建和分配的:

    Fixed_Array<char, 10> * fa1 = new Fixed_Array<char, 10>();
    Fixed_Array<char, 20> * fa2 = new Fixed_Array<char, 20>();
fa1 = fa1; //works
fa1 = fa2; //causes compiler to freak out

错误信息基本上是说我不能用10和20来做这件事;它并没有用模板提取我的第二个赋值运算符。

有什么建议吗?

您分配的是指针,而不是对象(导致内存泄漏是副作用!)。指针是不同类型的(<char,10><char,20>),所以编译器会抱怨它

您的operator =签名似乎是正确的,分配的语法应该是:

*fa1 = *fa2; // ok  (no memory leak)

如何在一个应该具有固定大小的类上调用resize?这不会破坏东西吗?

例如,

Fixed_Array<char, 10> little1;
Fixed_Array<char, 20> big1, big2;
big1 = little1;
/* now big1 has size 10, because it was resized */
big1 = big2; /* tries to store 20 elements into a buffer of size 10 */

这将损坏堆(从形式上讲,这是未定义的行为)。