我有一个包含剪贴板数据的矢量对象。我试图使用缓冲流将剪贴板数据的内容写入临时文件。我正在使用迭代器来访问向量的内容。
我在尝试将std::vector ClipboardDataVector
的剪贴板数据转换为类型为inbuffer
的{{1}}时遇到了麻烦。
以下是我使用的代码
const std::uint8_t* inBuffer
编译此代码时,我收到以下错误。
错误C2440:'type cast':无法转换为'std :: _ Vector_iterator< _Myvec>'到'const uint8_t *'
我是向量的新手,我发现很难理解这个错误 - 我该如何解决?
答案 0 :(得分: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交互),那么第一个元素的地址就是安全,可移植的方式。
(我也提到clipBoardData
也是const
- 这是一个很好的习惯,标记你不会改变的事情const