2013-08-31 48 views
2

我的代碼片段:的std :: vector的的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不,頂點聲明爲'std :: vector ',我也會對第二部分說不。 unique_ptr似乎僅僅爲了將副本推回到向量中而持有堆分配對象。釋放會泄漏內存。 – Borgleader

+1

錯誤行是:'vertices-> push_back(* vertice);'?編譯器在抱怨這一行? – antonte

回答

6

std::vector<T>的值類型T需要是CopyInsertible或MoveInsertible。爲了要麼,就必須調用

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

道德等效採用T是一個const類型,這並不工作,例如,因爲從T*void*沒有轉換,如果T的形式爲X const的。您想從std::vector<const RM3DVertice>中刪除const

+0

+1所以我沒有幻覺。感謝理智。 – WhozCraig

+0

謝謝你做到了。所以只是爲了確保我明白了:通過使向量成員爲const,我進入了std :: vector代碼的方式(它需要它們不是const,而是CopyInsertible + MoveInsertible)? – diegoreymendez

+1

@diegoreymendez:是的,這是正確的。在C++ 11中,你可以在類型'T'上做很少的操作,但是有一些最小的需求是無法避免的。 –