2013-08-31 2 views
2

내 조각 :표준 : : 벡터의와 push_back()의 ​​원인이 이상한 컴파일 타임 오류 메시지 코드의

void 
RMWavefrontFileImporter::loadVertexIntoVector(
    const std::vector<std:string> lineElements, 
    std::vector<const RM3DVertex>* vertices) 
{ 
    assert(vertices); 

    std::unique_ptr<const RM3DVertex> verticeRef = verticeWithElements(lineElements); 

    const RM3DVertex* vertex = vertexRef.get(); 
    assert(vertex); 

    vertices->push_back(*vertex); 
} 

내가지고있어 오류 메시지 :

유형의 매개 변수를 초기화 할 수 없습니다 ' void * '와 왼쪽에'const RM3DVertice * '

나는이 문제를 보지 못했습니다. 내가 놓친 게 분명해?

+0

'vertices-> push_back (vertice)'이 아니어야합니까? 또한 unique_ptr을 해제해야 할 수도 있습니다 ... – Pubby

+1

@Pubby 아니요, vertices는'std :: vector '로 선언되며 두 번째 부분에도 no라고 말하고 싶습니다. unique_ptr은 사본을 벡터로 푸시하기위한 용도로만 힙 할당 객체를 보유하고있는 것으로 보입니다. 해제하면 메모리가 누출됩니다. – Borgleader

+1

오류 라인은 :'vertices-> push_back (* vertice);'? 컴파일러가이 줄에 대해 불평하고 있습니까? – antonte

답변

6

std::vector<T>의 값 유형 T은 CopyInsertible 또는 MoveInsertible이어야합니다. 이 될하기 위해서는 void*T*로부터 변환이 없기 때문에 T 양식 X const의 경우, T이 작동하지 않는 const 유형, 예를 들어 인으로

T* tptr = <allocate-memory-over-here-and-make-it-look-like-a-T*> 
new(tptr) T(std::forward<Args>(args); 

의 도덕적 동등를 호출 할 필요가있다 . conststd::vector<const RM3DVertice>에서 제거하고 싶습니다.

+0

+1 그래서 나는 환각을 느끼지 않았다. 정신 차려 줘서 고마워. – WhozCraig

+0

고마워요. 그래서 내가 이해했는지 확인하기 위해서 : 벡터 멤버를 const로 만들어서 std :: vector 코드 (const가 아니고 대신 CopyInsertible + MoveInsertible이 될 필요가 있음)의 길로 들어갔다. – diegoreymendez

+1

@diegoreymendez : 예, 맞습니다. C++ 11에서는 타입'T'에서 거의 작동하지 않을 수 있지만 피할 수없는 최소한의 요구 사항이 있습니다. –