3

クリップボード データを含むベクター オブジェクトがあります。バッファリングされたストリームを使用して、クリップボード データの内容を一時ファイルに書き込もうとしています。ベクトルの内容にアクセスするためにイテレータを使用しています。

タイプのクリップボード データを に変換しようとしているときに、問題が発生していstd::vector ClipboardDataVectorます。inbufferconst 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>' から 'const uint8_t *' に変換できません

私はベクターを初めて使用し、このエラーを理解するのが難しいと感じています - どうすれば解決できますか?

4

1 に答える 1

5

a を使用するときは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 と対話しているため)、最初の要素のアドレスが安全で移植可能な方法です。

(私も参照を作成しましたclipBoardData-いつもconstのように変更しないものをマークすることは良い習慣ですconst

于 2012-06-02T07:35:32.317 に答える