[英]C++ types and functions
我在編譯代碼時遇到了一些麻煩-與我傳入的類型有關。這是編譯器所說的:
R3Mesh.cpp: In copy constructor 'R3Mesh::R3Mesh(const R3Mesh&)':
R3Mesh.cpp:79: error: no matching function for call to 'R3Mesh::CreateHalfEdge(R3MeshVertex*&, R3MeshFace*&, R3MeshHalfEdge*&, R3MeshHalfEdge*&)'
R3Mesh.h:178: note: candidates are: R3MeshHalfEdge* R3Mesh::CreateHalfEdge(const R3MeshVertex*&, const R3MeshFace*&, const R3MeshHalfEdge*&, const R3MeshHalfEdge*&)
R3Mesh.cpp: In constructor 'R3MeshHalfEdge::R3MeshHalfEdge(const R3MeshVertex*&, const R3MeshFace*&, const R3MeshHalfEdge*&, const R3MeshHalfEdge*&)':
R3Mesh.cpp:1477: error: invalid conversion from 'const R3MeshVertex*' to 'R3MeshVertex*'
R3Mesh.cpp:1477: error: invalid conversion from 'const R3MeshFace*' to 'R3MeshFace*'
R3Mesh.cpp:1477: error: invalid conversion from 'const R3MeshHalfEdge*' to 'R3MeshHalfEdge*'
R3Mesh.cpp:1477: error: invalid conversion from 'const R3MeshHalfEdge*' to 'R3MeshHalfEdge*'
這是我定義R3MeshHalfEdge的方法:
struct R3MeshHalfEdge {
// Constructors
R3MeshHalfEdge(void);
R3MeshHalfEdge(const R3MeshHalfEdge& half_edge);
R3MeshHalfEdge(const R3MeshVertex*& vertex, const R3MeshFace*& face,
const R3MeshHalfEdge*& opposite, const R3MeshHalfEdge*& next);
R3MeshVertex *vertex;
R3MeshFace *face;
R3MeshHalfEdge *opposite;
R3MeshHalfEdge *next;
int id;
};
這是第一個錯誤抱怨的地方:
R3MeshHalfEdge *R3Mesh::
CreateHalfEdge(const R3MeshVertex*& vertex, const R3MeshFace*& face,
const R3MeshHalfEdge*& opposite, const R3MeshHalfEdge*& next)
{
// Create half_edge
R3MeshHalfEdge *half_edge = new R3MeshHalfEdge(vertex, face, opposite, next);
// Set half_edge ID
half_edge->id = half_edges.size();
// Add to list
half_edges.push_back(half_edge);
// Return half_edge
return half_edge;
}
這是第二個錯誤抱怨的地方:
R3MeshHalfEdge::
R3MeshHalfEdge(const R3MeshVertex*& vertex, const R3MeshFace*& face,
const R3MeshHalfEdge*& opposite, const R3MeshHalfEdge*& next)
: vertex(vertex),
face(face),
opposite(opposite),
next(next),
id(0)
{
}
這是我調用CreateHalfEdge函數的地方:
for(int i=0; i<mesh.NFaces(); i++)
{
R3MeshFace *f = mesh.Face(i);
vector<R3MeshVertex *> face_vertices; // assume vertices are stored in order around the perimeter of the face
for(unsigned int j = 0; j<f->vertices.size(); j++)
{
R3MeshVertex *v1 = f->vertices[j];
R3MeshVertex *v2;
if(j==f->vertices.size()-1)
v2 = f->vertices[0];
else
v2 = f->vertices[j+1];
int v1_id = v1->id;
int v2_id = v2->id;
R3MeshHalfEdge *next = NULL;
R3MeshHalfEdge *opposite = NULL;
R3MeshHalfEdge *half_edge = CreateHalfEdge(v1, f, opposite, next);
}
... }
看來,您正在將非const指針傳遞給需要const指針參數的函數。
注意:
...但這不是問題。 我懷疑這里還有其他事情,但是問題是缺少一些信息。 編譯器錯誤與副本構造函數R3Mesh :: R3Mesh(const R3Mesh&)中的某件事有關,該問題未顯示。
編輯:確定,現在顯示。 我建議先清除對指針問題的const引用,然后看看還剩下什么。
實際上,第二個錯誤非常清楚-R3MeshHalfEdge構造函數的參數不應引用const指針(告訴編譯器您無意更改其指向的對象)或為這些參數分配數據成員to應該是const指針本身。
構造函數是錯誤的:
R3MeshHalfEdge(const R3MeshVertex*& vertex, const R3MeshFace*& face,
const R3MeshHalfEdge*& opposite, const R3MeshHalfEdge*& next);
您將指針傳遞給const,並將它們分配給非常量的指針,這將失敗。
像這樣更正它:
R3MeshHalfEdge(R3MeshVertex* vertex, R3MeshFace* face,
R3MeshHalfEdge* opposite, R3MeshHalfEdge* next);
備注:
const
有兩個級別:指向const
指針( const X*
)和const指針( X* const
),前者可以指向其他對象,但不能更改所指向的對象,而后者不能反彈到另一個對象,但是可以更改指向的對象。 您可以將它們組合起來以擁有指向const的const指針( const X* const
) *&
)傳遞指針。 說const type *¶meter
表示您可以修改parameter
:
void foo(const int *¶meter)
{
int bar= 0;
parameter= &bar;
}
我懷疑您不想這樣做。 與其按引用傳遞指針,不如按值傳遞它們(因為您沒有對其進行修改)或按const引用傳遞它們( const type * const ¶meter
)。
您需要查看您的論點,然后重新評估什么應該保持不變,什么不應該保持不變。
拋出編譯器錯誤是因為您將非恆定指針(例如,頂點)指向了恆定內存(頂點參數)。 在C ++中,常數和非常數變量是不同的類型。
通過閱讀這對於很多更詳細。
如果您只是想讓它工作,請刪除所有const,它將進行編譯。 如果要使參數保持不變,則必須執行復制復制和數據分配(而不是指針!)以消除錯誤。
另外,重命名自變量,以免與成員變量發生名稱沖突。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.