Прежде всего, я бы порекомендовал не реализовывать свой собственный вектор. Здесь много подводных камней, и сложно сделать это правильно.
Существует много проблем, препятствующих конвертации.
Во-первых, ваш operator=
получает изменяемую ссылку на вектор:
// not const -------v
ArrayVector& operator= (std::vector<Object>& stlv){
ArrayVector copy = stlv;
std::swap(*this, copy);
return *this;
}
// v------- not const either
ArrayVector(std::vector<Object>& stl_vector_para){
Arr = stl_vector_para;
capacity = stl_vector_para.capacity();
num_longElem = stl_vector_para.size();
}
Используются изменяемые ссылки, но вам не нужно фактически изменять вектор. Создание их const исправит первую проблему, так как вы пытаетесь передать ему вектор const:
// a reference to a const vector ---v
STATUS load(const std::string filename, const std::vector<long>& initialMemory) {
myDataMem = initialMemory;
// ^----- cannot pass a const vector to a
// function that takes a mutable one
return machineStatus;
}
Тогда у вас есть проблема на всю жизнь:
// returns by reference
std::vector<Object>& tempVec_to_stlVec(ArrayVector& av) {
// to_stdVec lives until the end of the function
std::vector<Object> to_stdVec = av;
return to_stdVec; // return a reference to an object that will die
}
Локальные переменные не живут за пределами своих областей. Вы возвращаете ссылку на мертвый вектор. Вместо этого просто верните значение:
// by value
std::vector<Object> tempVec_to_stlVec(ArrayVector& av) {
// to_stdVec lives until the end of the function
std::vector<Object> to_stdVec = av;
return to_stdVec; // return the object by value
}
Оптимизация возвращаемого значения позаботится об эффективности возврата. Если эта оптимизация не может быть выполнена, конструктор перемещения позаботится об этом.
Потом я увидел ошибки, которых не было в опубликованных ошибках.
Векторы не конвертируются в указатели:
Arr = stl_vector_para;
Так не работает. Если вы действительно хотите создать свой собственный векторный класс, вы должны выполнить динамическое распределение и скопировать данные вручную.
C ++ предлагает такую структуру данных по одной причине: чтобы сделать нашу жизнь проще и сделать C ++ приятным. Реализация вашего собственного вектора - это обычно боль, если вы не знаете, что делаете.