не удается преобразовать параметр 1 из ‘char *’ в ‘uint8_t *’

#c #memory

#c #память

Вопрос:

 void OnReceived(std::shared_ptr<uint8_t> buffer, int len) {
.........
}

int main(){
std::vector<char> buffer(1000);
OnReceived((std::shared_ptr<uint8_t>)buffer.data(),rcvlen);
}
  

пытаюсь применить его, но не могу, не знаю почему!!!

 Error   1   error C2664: 'std::tr1::_Ptr_base<_Ty>::_Reset0' : cannot convert parameter 1 from 'char *' to 'uint8_t *'  c:program filesmicrosoft visual studio 10.0vcincludememory 1705
  

итак, как я могу его преобразовать?

Комментарии:

1. Возможно (std::shared_ptr<uint8_t>)(uint8_t*)buffer.data() ?

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

Ответ №1:

Вы действительно не хотите этого делать. Помимо того факта, что char и uint8_t могут быть разными типами, даже если вы принудительно скомпилируете код, ваш буфер будет освобожден дважды, что, вероятно, приведет к сбою вашей программы. Просто измените onReceived, чтобы принять необработанный указатель.

Комментарии:

1. 1 — назначение интеллектуального указателя — управлять временем жизни объекта. Если функция не может повлиять на время жизни объекта, не имеет значения, передаете ли вы ей интеллектуальный указатель или немой, с немой проще работать.

Ответ №2:

Помимо несоответствия типов, вы не хотите этого делать. Это почти приведет к сбою, когда и векторный деструктор, и shared_ptr освободят одну и ту же память. Вам следует рассмотреть boost::shared_array или общий указатель на весь вектор ( shared_ptr<std::vector> ) вместо того, что вы делаете сейчас. Или, как предлагает Игорь, OnReceived можно было бы изменить, чтобы принять необработанный указатель, если для этого не требуется совместное владение буфером.

Ответ №3:

uint8_t является unsigned char поэтому вам нужно либо изменить тип буфера, либо переинтерпретировать_каст где-нибудь в строке.

Ответ №4:

buffer.data() вернет символ * . Вы пытаетесь преобразовать это в std::shared_ptr — другими словами, создать из него shared_ptr. В своей реализации он пытается присвоить указатель, но не может, поскольку вы передаете несовместимый тип указателя.

Попробуйте привести его к соответствующему типу перед передачей, например:

 OnReceived((std::shared_ptr<uint8_t>)(uint8_t *)buffer.data(),rcvlen);
  

или, возможно, лучшее решение, преобразовать ваш std::vector в вектор uint8_t.