Я не знаю, почему я не могу перегрузить оператор "=", подобный следующему
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 ". Если я удаляю память, освобождающуюся в деструкторе, она останавливается без ошибок. Теперь я не хочу получать эту ошибку при сохранении освобождения памяти в деструкторе.
Если у меня нет ошибки, последнее назначение не вызывает мой оператор перегрузки. Пожалуйста, помогите мне.