2012-06-02 3 views
3

클립 보드 데이터가 포함 된 벡터 객체가 있습니다. 버퍼 된 스트림을 사용하여 임시 파일에 클립 보드 데이터의 내용을 쓰려고합니다. 나는 이터레이터를 사용하여 벡터의 내용에 접근하고있다.uint8_t 벡터 반복기를 const uint8_t *로 변환 할 수 없습니다.

std::vector ClipboardDataVector의 데이터를 인 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>' 'const를 uint8_t *'

내가 벡터에 새로운 오전과 내가 하드를 찾는 오전 이 오류 주위에 내 머리를 얻을 - 어떻게 해결할 수 있습니까?

답변

5

std::vector을 사용할 때 보유하고있는 형식을 지정해야합니다. 그래서 typedef 필요가되게합니다 :이 때문에 작동

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

:

typedef std::vector<uint8_t> ClipboardDataVector; 

당신이 그 유형의 벡터를 가지고 당신이 const uint8_t * 일반적인 관용구를 얻으려면 것을 수행하면 벡터는 연속적인 저장 공간을 가지고 있습니다 - 벡터의 첫 번째 요소에 대한 포인터를 요구하고 있습니다. 또한 벡터가 비어있는 특별한 경우를 검사하여 첨자 연산자를 사용할 수 없습니다. 이것은 요소들이 항상 인접하지는 않는 std::list과 같은 것에 대해서는 명확하게 작동하지 않을 것입니다.

반복자를 사용하면 올바른 종류의 트랙을 만들었지 만 반복자는 포인터의 개념을 일반화 한 것입니다. 즉, 포인터처럼 보이거나 느낌이 들지만 포인터 나 연산자 오버로딩 중 하나에 의해 나타납니다. 꼭 실제로 포인터가 될 필요는 없습니다. 벡터에서 포인터가 필요한 경우 (보통 C와 상호 작용하기 때문에) 첫 번째 요소의 주소가 안전하고 이식 가능한 방법입니다. ;

+0

일이이 ansswer입니다 -

는 (당신은 항상 const으로 변경하지 않습니다 일을 표시, 그것은에서 할 수있는 좋은 습관 또한 clipBoardData에 대한 참조도 const 일했다) const ClipboardDataVector &를 사용 하겠지만 데이터를 파일에 쓸 때 데이터가 변경되지는 않을 것입니다. – stijn

+0

@stijn - 동의 했으니 까, 나는 일종의 이유로 여기 간과 해 버렸지 만 그것을 내 대답에 추가했습니다. – Flexo

+0

정말 고마워요. 그건 완벽하게 잘 작동 :) –

관련 문제