我有一个包含剪贴板数据的矢量对象.我试图使用缓冲流将剪贴板数据的内容写入临时文件.我正在使用迭代器来访问向量的内容.
我遇到了麻烦试图剪贴板数据这是一个转换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());
}
Run Code Online (Sandbox Code Playgroud)
当我编译此代码时,我收到以下错误.
错误C2440:'type cast':无法从'std :: _ Vector_iterator <_Myvec>'转换为'const uint8_t*'
我是向量的新手,我发现很难理解这个错误 - 我该如何解决?
当你使用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进行交互),那么第一个元素的地址就是安全,可移植的方式.
(我也做了参考clipBoardData是const也-这是一个好习惯是,这标志着东西,你就不会因为改变const总是)
| 归档时间: |
|
| 查看次数: |
1042 次 |
| 最近记录: |