Как передать std :: vector* как std :: vector* к функции - PullRequest
0 голосов
/ 21 сентября 2018

Как передать std::vector<void*> * как std::vector<MyStruct*>* в функцию?

Объявление функции будет void SetDataReferences(std::vector<MyStruct*>* pVector);

, если я передам std::vector<void*> * как std::vector<MyStruct*>* Я получаю нижеошибка

ошибка C2664: 'CTagFilterComboBox :: SetDataReferences': невозможно преобразовать параметр 2 из 'std::vector<_Ty> *' в 'std::vector<_Ty> *'

Как решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Если вам не нужно изменять vector<void*> foo, тогда вы можете просто работать с базовыми данными, изменив сигнатуру своей функции на: void SetDataReferences(MyStruct*const* pVector, const size_t length) (помните, что const остается ассоциативным, так что это указатель-to-constant-pointers-to-MyStructs.) Это можно вызвать следующим образом:

SetDataReferences(reinterpret_cast<MyStruct*const*>(data(foo)), size(foo))

Если вам нужно изменить элементы vector<void*> foo (не размер), у вас все еще есть обращение кизменение сигнатуры функции на: void SetDataReferences(MyStruct** pVector, const size_t length) Это можно вызвать следующим образом:

SetDataReferences(reinterpret_cast<int**>(data(foo)), size(foo))

Live Примеры

Если вам нужно изменитьvector<void*> foo, что усложняется, вам нужно будет принять vector<void*>, как это делает сигнатура вашей функции в вопросе, и использовать элементы, а не как группу.

0 голосов
/ 24 сентября 2018

Я получил решение для моей проблемы по этой ссылке https://www.codeproject.com/Questions/1261243/How-to-pass-std-vector-void-as-std-vector-mystruct, и она работает для меня.

Если я вызываю SetDataReferences((std::vector<MyStruct*>*)(&p1)), она работает для меня без получения ошибки компилятора.

0 голосов
/ 21 сентября 2018

К сожалению, std::vector<void*> - это совершенно другой тип, чем std::vector<MyStruct*>*, поэтому приведение не будет работать.

Вам необходимо перестроить вектор с нуля и передать указатель на него своей функции,и надеемся, что static_cast на каждом элементе является действительным.

В одну сторону, учитывая std::vector<void*>* foo;

std::vector<MyStruct*> temp;
for (void* p : *foo){
    temp.push_back(static_cast<MyStruct*>(p));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...