2011-05-25 249 views
0
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); 
} 

正在嘗試投射它但我不能知道爲什麼!無法將參數1從'char *'轉換爲'uint8_t *'

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

也許'(std :: shared_ptr )(uint8_t *)buffer.data()'? – ikegami 2011-05-25 22:34:10

+0

類型的目的是爲了安全,其中你反正通過嘗試投射來擊敗目的。你應該嘗試理解每種類型的作用並以這種方式解決它,而不是試圖忽略它們。 – GManNickG 2011-05-25 23:10:59

回答

4

你真的不想那樣做。除了char和uint8_t可能是不同類型的事實,即使你強制編譯代碼,你的緩衝區也會被釋放兩次,可能會導致程序崩潰。只需將OnReceived更改爲接受原始指針。

+0

+1 - 智能指針的用途是控制對象的生命週期。如果一個函數不能影響對象的生命週期,那麼將它傳遞給一個智能指針或一個愚蠢的指針並不重要,而愚蠢的指針更容易處理。 – 2011-05-25 22:43:01

0

uint8_tunsigned char因此您需要更改緩衝區類型或reinterpret_cast沿線的某處。

0

buffer.data()將返回一個char *。你試圖將它轉換爲std :: shared_ptr - 換句話說,構造一個shared_ptr。在它的實現中,它試圖分配指針,但不能傳遞不兼容的指針類型。

嘗試通過它在之前鑄造到合適的類型,如:

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

,或者可能是一個更好的解決方案,您的std ::向量轉換爲uint8_t的載體。

1

除了類型不匹配之外,您不希望這樣做。當vector析構函數和shared_ptr釋放相同的內存時,它幾乎會導致崩潰。你應該考慮boost::shared_array或者一個指向整個向量的共享指針(shared_ptr<std::vector>),而不是你現在正在做的事情。或者如Igor所示,如果OnReceived不需要共享緩衝區所有權,則可以將OnReceived更改爲接受原始指針。

相關問題