2012-06-02 121 views
3

我有一個包含剪貼板數據的向量對象。我正嘗試使用緩衝流將剪貼板數據的內容寫入臨時文件。我使用迭代器來訪問矢量的內容。無法將uint8_t向量迭代器轉換爲常量uint8_t *

我試圖將std::vector ClipboardDataVector轉換爲inbuffer這種類型爲const std::uint8_t* inBuffer的剪貼板數據時遇到了麻煩。

下面是代碼,我使用

typedef std::vector ClipboardDataVector; 

File::WriteBlock(const std::uint8_t* inBuffer, std::uint32_t inBufferSize); 

BOOL WriteToTempFile(ClipboardDataVector& clipBoardData) { 
    std::vector::iterator clipBoardIterator; 
    clipBoardIterator = clipBoardData.begin(); 
    File::WriteBlock((const uint8_t *)clipBoardIterator, clipBoardData.size()); 
} 

當我編譯此代碼我碰到下面的錯誤。

錯誤C2440: '類型轉換':不能從轉換 '的std :: _ Vector_iterator < _Myvec>' 到 '常量uint8_t *'

我新的載體,我很難發現它讓我的頭繞過這個錯誤 - 我該如何解決它?

回答

5

當您使用std::vector時,您需要指定其保存的類型。所以,你需要typedef爲:

typedef std::vector<uint8_t> ClipboardDataVector; 

一旦你這樣做,如果你有這種類型的載體,你想獲得一個const uint8_t *通常的成語是:

void WriteToTempFile(const ClipboardDataVector& clipBoardData) { 
    const uint8_t *data = clipBoardData.size() ? &clipBoardData[0] : NULL; 
    // ... 
} 

這工作,因爲矢量具有連續的存儲 - 它要求指向矢量中第一個元素的指針。它還檢查矢量是否爲空的特殊情況,因此不能使用下標運算符。這顯然不適用於std::list這樣的元素不總是連續的。

你是在迭代器的正確類型的軌道上,但迭代器是一個指針概念的泛化 - 就是他們看起來和感覺像一個指針(無論是作爲指針或運算符重載),但他們'不一定總是會成爲一個指針。如果你需要一個矢量指針(因爲你通常和C交互),那麼第一個元素的地址就是安全,便攜的方式。

(我也做了參考clipBoardDataconst也 - 這是一個好習慣是,這標誌着東西,你將不會改變作爲const總是)

+0

+1這是ansswer;我會使用const ClipboardDataVector&雖然沒有太多的機會將數據寫入文件時將會改變。 – stijn

+0

@stijn - 同意,我有點忽略了在這裏出於某種原因,但已添加到我的答案。 – Flexo

+0

非常感謝。這工作非常好:) –