Перегрузка операторов шаблонами - PullRequest
0 голосов
/ 24 февраля 2012

Так что у меня возникают проблемы с перегрузкой оператора присваивания при работе с шаблонами. По сути, я использую пользовательский класс массива с изменяемым размером, который наследуется другим классом массива, который не может быть изменен. В любом случае, у меня есть два оператора равенства, один для работы с массивами одинакового размера, а другой для работы с массивами разных размеров, при условии, что тип одинаков.

Вот код для операторов:

// 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; это не мой второй оператор присваивания с шаблоном.

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Вы назначаете указатель, а не объект (вызывающий утечку памяти как побочный эффект!). Указатели бывают разных типов (<char,10> и <char,20>), поэтому компилятор жалуется на это.

Ваша operator = подпись кажется правильной, синтаксис для назначения должен быть:

*fa1 = *fa2; // ok  (no memory leak)
0 голосов
/ 24 февраля 2012

Как вы звоните 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 */

Это повредит кучу (формально это неопределенное поведение).

...