无法将参数1从'char *'转换为'uint8_t *'

时间:2011-05-25 22:29:28

标签: c++ memory

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

那我怎么转换呢?

4 个答案:

答案 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的向量。