[英]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.