繁体   English   中英

C ++类型和功能

[英]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 *&parameter表示您可以修改parameter

void foo(const int *&parameter)
{
    int bar= 0;
    parameter= &bar;
}

我怀疑您不想这样做。 与其按引用传递指针,不如按值传递它们(因为您没有对其进行修改)或按const引用传递它们( const type * const &parameter )。

您需要查看您的论点,然后重新评估什么应该保持不变,什么不应该保持不变。

抛出编译器错误是因为您将非恒定指针(例如,顶点)指向了恒定内存(顶点参数)。 在C ++中,常数和非常数变量是不同的类型。

通过阅读对于很多更详细。

如果您只是想让它工作,请删除所有const,它将进行编译。 如果要使参数保持不变,则必须执行复制复制和数据分配(而不是指针!)以消除错误。

另外,重命名自变量,以免与成员变量发生名称冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM