Оператор "=" не перегружен - PullRequest
0 голосов
/ 13 апреля 2020

Я не знаю, почему я не могу перегрузить оператор "=", подобный следующему

    template<unsigned short maxsz>
    const natural<MAX_SIZE> &operator=(const natural<maxsz> &source) {

        setValue(source);
        return *this;
    }

, где natural - это шаблонный класс natural \ для натурального числа, которое имеет размер и буфер внутри. setValue это просто скопировать размер и буфер из источника. Программа компилируется и запускается. Но перегруженный оператор не работает. Это будет работать, если естественный класс не является шаблонным.

Ниже приведен минимальный тест:

    #include <string.h>

    template<unsigned short MAX_SIZE>

    class natural {

    private:

        int size = 0;
        unsigned long long *binary = nullptr;

        void setValue(const unsigned long long *bin, int sz) {

            if (sz > 0) {

                if (binary)
                    delete[] binary;

                binary = new unsigned long long[sz];
                memcpy(binary, bin, sz * sizeof(unsigned long long));
                size = sz;
            }
        }

        template<unsigned short maxsz>
        void setValue(const natural<maxsz> &source) {

            setValue(source.binary, source.size);
        }

    public:

        natural() {}

        natural(const natural<MAX_SIZE> &source) {

            setValue(source);
        }

        natural(const unsigned long long *buffer, int sz) {

            setValue(buffer, sz);
        }

        void testnatural() {

            size = 10;
            binary = new unsigned long long[size];

            for (int i = 0; i < 10; i++)
                binary[i] = i;
        }

        template<unsigned short maxsz>
        natural<MAX_SIZE> testfunction(const natural<maxsz> source) {

            natural<MAX_SIZE> result(source.binary, source.size);
            return result;
}

        template<unsigned short maxsz>
        const natural<MAX_SIZE> &operator=(const natural<maxsz> &source) {

           setValue(source);
           return *this;
        }

        ~natural() {

            if (binary)
                delete[] binary;
        }

    };

    int main() {

        natural<100> a, b, c;

        c.testnatural();

        a = b.testfunction(c);

        return 0;
    }

Когда я запускаю программу, я получаю ошибку: "free (): double free обнаружен в tcache 2 ". Если я удаляю память, освобождающуюся в деструкторе, она останавливается без ошибок. Теперь я не хочу получать эту ошибку при сохранении освобождения памяти в деструкторе.

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

...