簡體   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