无法将uint8_t向量迭代器转换为const uint8_t*

Kar*_*esh 3 c++ types casting

我有一个包含剪贴板数据的矢量对象.我试图使用缓冲流将剪贴板数据的内容写入临时文件.我正在使用迭代器来访问向量的内容.

我遇到了麻烦试图剪贴板数据这是一个转换std::vector ClipboardDataVectorinbuffer哪种类型的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());
}
Run Code Online (Sandbox Code Playgroud)

当我编译此代码时,我收到以下错误.

错误C2440:'type cast':无法从'std :: _ Vector_iterator <_Myvec>'转换为'const uint8_t*'

我是向量的新手,我发现很难理解这个错误 - 我该如何解决?

Fle*_*exo 5

当你使用a时,std::vector你需要指定它所拥有的类型.所以你typedef需要:

typedef std::vector<uint8_t> ClipboardDataVector;
Run Code Online (Sandbox Code Playgroud)

一旦你完成了这个,如果你有一个这种类型的向量,你想得到一个const uint8_t *通常的习语是:

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

这是有效的,因为向量具有连续的存储 - 它要求指向向量中的第一个元素.它还检查向量为空的特殊情况,因此不能使用下标运算符.这显然不适用于std::list元素并不总是连续的地方.

您使用迭代器处于正确的轨道上,但迭代器是指针概念的概括 - 它们看起来像一个指针(通过指针或某些运算符重载)但它们不一定会发生实际上总是一个指针.如果你需要一个来自向量的指针(因为你通常与C进行交互),那么第一个元素的地址就是安全,可移植的方式.

(我也做了参考clipBoardDataconst也-这是一个好习惯是,这标志着东西,你就不会因为改变const总是)