3

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

我在尝试将剪贴板数据转换为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>”转换为“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 交互),那么第一个元素的地址是安全、可移植的方式。

(我也提到了,这clipBoardDataconst一个好习惯,像往常一样标记你不会改变的东西const

于 2012-06-02T07:35:32.317 回答