2012-06-02 6 views
3

У меня есть векторный объект, который содержит данные буфера обмена. Я пытаюсь записать содержимое данных буфера обмена в файл temp с использованием буферизованного потока. Я использую итераторы для доступа к содержимому вектора.Невозможно преобразовать векторный итератор uint8_t в const uint8_t *

Я столкнулся с проблемой при попытке конвертировать данные в буфер обмена, который является 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: 'приведение типа': не может конвертировать из 'станд :: _ Vector_iterator < _Myvec>' на 'сопзЬ uint8_t *'

Я новичок в векторах, и я нахожу это трудно узнайте об этой ошибке - как я могу ее решить?

ответ

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), то адрес первого элемента - безопасный, переносимый способ сделать это.

(Я также сделал ссылку на clipBoardDataconst быть также - это хорошая привычка быть, маркировка вещей, которые вы не будете изменять, как const всегда)

+0

+1 это ansswer; Я бы использовал const ClipboardDataVector, хотя, как нет большого шанса, что данные будут меняться при записи в файл. – stijn

+0

@stijn - согласился, я почему-то забыл об этом здесь, но добавил его в свой ответ. – Flexo

+0

Большое вам спасибо. Это отлично работало :) –

Смежные вопросы