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 files\microsoft visual studio 10.0\vc\include\memory 1705
那我怎么转换呢?
答案 0 :(得分:4)
你真的不想这样做。除了char和uint8_t可能是不同类型的事实之外,即使你强制编译代码,你的缓冲区也会被释放两次,可能会导致你的程序崩溃。只需更改OnReceived即可接受原始指针。
答案 1 :(得分:1)
除了类型不匹配之外,你不想这样做。当向量析构函数和shared_ptr都释放相同的内存时,它几乎会导致崩溃。您应该考虑boost::shared_array
或指向整个向量(shared_ptr<std::vector>
)的共享指针,而不是您现在正在做的事情。或者正如Igor建议的那样,OnReceived
可以更改为接受原始指针,如果它不需要缓冲区的共享所有权。
答案 2 :(得分:0)
uint8_t
是一个unsigned char
,因此您需要更改缓冲区的类型或在行的某处更改reinterpret_cast。
答案 3 :(得分:0)
buffer.data()将返回一个char *。你试图将它转换为std :: shared_ptr - 换句话说,构造一个shared_ptr。在它的实现中,它尝试分配指针,但不能,因为你传入了一个不兼容的指针类型。
尝试在传入之前将其强制转换为适当的类型,例如:
OnReceived((std::shared_ptr<uint8_t>)(uint8_t *)buffer.data(),rcvlen);
或者,可能是更好的解决方案,将你的std :: vector转换为uint8_t的向量。