C ++类型和函数

时间:2010-02-22 16:15:21

标签: c++ function parameters types

我在编译代码时遇到了一些麻烦 - 它与我传入的类型有关。这就是编译器所说的:

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);  

        }

... }

4 个答案:

答案 0 :(得分:2)

你将非const指针传递给一个需要const指针参数的函数,似乎。

注意:

......但这应该不是问题。我怀疑这里还有其他东西,但问题是遗漏了一些信息。编译器错误是关于复制构造函数R3Mesh :: R3Mesh(const R3Mesh&amp;)中的某些内容,它未在问题中显示。

编辑:好的,现在就显示了。我建议首先清除指针问题的const引用,然后看看剩下的是什么。

第二个错误很明显,实际上 - R3MeshHalfEdge构造函数的参数不应该是对const指针的引用(它告诉编译器你不打算改变它们指向的对象)或数据成员你将这些参数赋值为const指针本身。

答案 1 :(得分:2)

构造函数错误:

  R3MeshHalfEdge(const R3MeshVertex*& vertex, const R3MeshFace*& face, 
                 const R3MeshHalfEdge*& opposite, const R3MeshHalfEdge*& next);

您将指针传递给const并将它们分配给指向非const的指针,该指针失败。

像这样纠正:

  R3MeshHalfEdge(R3MeshVertex* vertex, R3MeshFace* face, 
                 R3MeshHalfEdge* opposite, R3MeshHalfEdge* next);

作为评论:

  • 有两个级别的const带指针:指向constconst X*)和const指针(X* const),前者可以指向别的但不能改变指向的对象虽然后者不能反弹到另一个对象但可以改变指向的对象。您可以将它们组合成const指针(const X* const
  • 不要通过引用(*&)传递指针,除非您打算修改指针本身,而不是指向对象。

答案 2 :(得分:2)

const type *&parameter表示您可以修改parameter

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

我怀疑你不想这样做。不是通过引用传递指针,而是通过值传递它们(因为你没有修改它们)或者通过const引用(const type * const &parameter)传递它们。

答案 3 :(得分:1)

你需要查看你的论点,并重新评估应该是什么,不应该是什么。

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

仔细阅读this了解详情。

如果你只想让它工作,删除所有的功能,它将编译。如果你希望你的参数是常量,你将不得不进行复制和数据分配(而不是指针!)来删除错误。

此外,重命名您的参数,以便您不会与成员变量发生名称冲突。