Помогите разобраться с заданием:
В предыдущей версии предполагается, что для типа T определен оператор присваивания или он ему не нужен (например, для примитивных типов он не нужен). При создании шаблонных классов контейнеров (вроде Array и не только) разумно стараться минимизировать требования к типам шаблонных параметров. Поэтому усложним задачу, реализуйте класс Array не полагаясь на то, что для типа T определен оператор присваивания. Hints: используйте placement new и явный вызов деструктора, чтобы создавать и уничтожать объекты, аллоцировать правильно выровненную память можно с помощью new char[N * sizeof(T)], где N - количество элементов массива.
#include <cstddef>
template <typename T>
class Array
{
// Список операций:
//
// Array(size_t size, const T& value = T())
// конструктор класса, который создает
// Array размера size, заполненный значениями
// value типа T. Считайте что у типа T есть
// конструктор, который можно вызвать без
// без параметров, либо он ему не нужен.
//
// Array()
// конструктор класса, который можно вызвать
// без параметров. Должен создавать пустой
// Array.
//
// Array(const Array &)
// конструктор копирования, который создает
// копию параметра. Для типа T оператор
// присвивания не определен.
//
// ~Array()
// деструктор, если он вам необходим.
//
// Array& operator=(...)
// оператор присваивания.
//
// size_t size() const
// возвращает размер массива (количество
// элемнтов).
//
// T& operator[](size_t)
// const T& operator[](size_t) const
// две версии оператора доступа по индексу.
};
Вот моё решение:
template <typename T>
class Array
{
public:
explicit Array(size_t size = 0, const T& value = T())
:size_(size), data(new T[size])
{
for (int i=0; i<size; i++)
data[i] = value;
}
//Array():size_(0), data(new T[0]) {}
Array(const Array &arrayToCopy)
{
size_ = arrayToCopy.size();
data = static_cast<T*>(operator new[] (size_ * sizeof(T)));
for ( int i = 0; i < size_; ++i)
data[i] = arrayToCopy[i];
}
~Array()
{
for (int i = 0; i < size_; i++)
{
data[i].~T();
}
operator delete[](data);
}
Array& operator=(const Array & right)
{
size_=right.size();
char * buff = new char[size_ * sizeof(T)];
data = new (buff) T[size_];
for (int i=0; i< size_; ++i)
data[i]=right[i];
return *this;
}
size_t size() const
{
return size_;
}
T& operator[](size_t i)
{
return data[i];
}
const T& operator[](size_t i) const
{
return data[i];
}
private:
size_t size_;
T * data;
};
А вот выхлоп:
Compilation error main.cpp: In instantiation of ‘Array<T>::Array(size_t, const T&) [with T = Trace; size_t = long unsigned int]’: main.cpp:188:23: required from here main.cpp:177:9: error: ‘Trace& Trace::operator=(const Trace&)’ is private main.cpp:114:13: error: within this context main.cpp: In instantiation of ‘Array<T>& Array<T>::operator=(const Array<T>&) [with T = Trace; Array<T> = Array<Trace>]’: main.cpp:192:11: required from here main.cpp:177:9: error: ‘Trace& Trace::operator=(const Trace&)’ is private main.cpp:140:13: error: within this context main.cpp: In instantiation of ‘Array<T>::Array(const Array<T>&) [with T = Trace; Array<T> = Array<Trace>]’: main.cpp:195:28: required from here main.cpp:177:9: error: ‘Trace& Trace::operator=(const Trace&)’ is private main.cpp:123:13: error: within this context
Подскажите где ошибка?