На самом деле ОП опускает важные детали.
Тем не менее, я осмелюсь написать ответ, так как он на самом деле вполне понятен.
Копировать назначение std::vector
возможно, когда
- вектор источника и назначения имеет одинаковый тип элемента
- тип элемента обеспечивает назначение копирования.
Пример:
#include <iostream>
#include <vector>
struct T {
int value;
};
struct U {
int value;
U& operator=(const U&) = delete;
};
int main ()
{
#if 1 // OK:
{ std::vector<T> v1(10), v2;
v2 = v1;
std::cout << "After v2 = v1; v2 has size " << v2.size() << '\n';
}
#else // Wrong: (U has no assignment!)
{ std::vector<U> v1(10), v2;
v2 = v1;
std::cout << "After v2 = v1; v2 has size " << v2.size() << '\n';
}
#endif // 1
return 0;
}
Вывод:
After v2 = v1; v2 has size 10
Живая демонстрация на coliru
struct T
имеет (по умолчанию) назначение копированияно в struct U
я явно удалил его.
Изменив #if 1
на #if 0
, код больше не компилируется.
После того, как OP предоставил недостающую информацию,обновление моего ответа:
std::vector::assign()
является альтернативой, когда
- тип элемента исходного вектора может быть назначен типу элемента вектора назначения.
Это верно для присвоения MyStruct*
для void*
в конкретном случае OP.
Пример:
#include <iostream>
#include <vector>
struct T {
int value;
};
struct U {
int value;
U& operator=(const T &t) { value = t.value; return *this; }
};
int main ()
{
{ std::vector<T> v1(10);
std::vector<U> v2;
v2.assign(std::begin(v1), std::end(v1));
std::cout << "After v2.assign(std::begin(v1), std::end(v1)) v2 has size " << v2.size() << '\n';
}
#if 1 // OK:
{ T t[] = { { 1 }, { 2 }, { 3 } };
std::vector<T*> v1{ t + 0, t + 1, t + 2 };
std::vector<void*> v2;
v2.assign(std::begin(v1), std::end(v1));
std::cout << "After v2.assign(std::begin(v1), std::end(v1)) v2 has size " << v2.size() << '\n';
}
#else // Wrong: (Assignment from void* to T* not permitted!)
{ std::vector<void*> v1(10, nullptr);
std::vector<T*> v2;
v2.assign(std::begin(v1), std::end(v1));
std::cout << "After v2.assign(std::begin(v1), std::end(v1)) v2 has size " << v2.size() << '\n';
}
#endif // 1
return 0;
}
Выход:
After v2.assign(std::begin(v1), std::end(v1)) v2 has size 10
After v2.assign(std::begin(v1), std::end(v1)) v2 has size 3
Живая демоверсия на колиру