Третий аргумент std::copy
должен быть итератором, а не контейнером. Вы можете использовать std::back_inserter
таким образом:
std::copy(paramVector.begin(), paramVector.end(), std::back_inserter(tempVector));
Вторая копия будет скомпилирована, поскольку std::end()
возвращает итератор, но он сломается, потому что итератор просто указывает на конец вектора. Вектор не будет расти, когда std::copy
попытается присвоить ему; это просто вызовет неопределенное поведение. Опять же, std::back_inserter
решает проблему.
В любом случае вам вообще не нужен std::copy
, поскольку std::vector
обеспечивает необходимую семантику напрямую:
TestVector TestVector::operator+(const TestVector& v)
{
std::vector<int> t(myVector);
t.insert(t.end(), v.myVector.begin(), v.myVector.end());
return TestVector(t);
}
И не забывайте использовать const &…
, чтобы избежать такого большого копирования. Например, второй конструктор копирует входной вектор без необходимости, а getVector()
копирует внутренний вектор без необходимости.
Даже приведенное выше решение копирует временный вектор хотя бы один раз, чего можно избежать с помощью специального конструктора:
class TestVector
{
std::vector<int> myVector;
public:
TestVector() { }
TestVector(const std::vector<int>& v) : myVector(v) { }
const std::vector<int>& getVector() const { return myVector; }
TestVector operator+(const TestVector& v) const {
return TestVector(op_add(), *this, v);
}
private:
struct op_add { };
TestVector(op_add, const TestVector& a, const TestVector& b) : myVector(a) {
myVector.insert(myVector.end(), b.myVector.begin(), b.myVector.end());
}
};