C ++ типы и функции - PullRequest
       16

C ++ типы и функции

1 голос
/ 22 февраля 2010

У меня проблемы с компиляцией кода - это связано с типами, которые я передаю. Вот что говорит компилятор:

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 ]

2 голосов
/ 22 февраля 2010

Сказать const type *&parameter означает, что вы можете изменить parameter:

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

Я подозреваю, что вы не хотите этого делать. Вместо передачи указателей по ссылке, либо передайте их по значению (так как вы не изменяете их), либо передайте их по постоянной ссылке (const type * const &parameter).

2 голосов
/ 22 февраля 2010

Неправильный конструктор:

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

Вы передаете указатели на const и назначаете их указателям на non-const, что не получается.

Исправьте это так:

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

В качестве замечания:

  • есть два уровня const с указателями: указатели на const (const X*) и константные указатели (X* const), первый может указывать на что-то другое, но не может изменить объект, на который указывает, в то время как последний не может быть привязан к другому объекту, но может изменить указанный объект. Вы можете объединить их, чтобы иметь константный указатель на const (const X* const)
  • не передавайте указатели по ссылке (*&), если вы не собираетесь изменять сам указатель, а не объект, на который указывает.
2 голосов
/ 22 февраля 2010

Похоже, вы передаете неконстантные указатели в функцию, которая ожидает аргументы константного указателя.

Примечание:

... Но это не должно быть проблемой. Я подозреваю, что здесь происходит что-то еще, но в вопросе отсутствует некоторая информация. Ошибка компилятора о чем-то в конструкторе копирования R3Mesh :: R3Mesh (const R3Mesh &), который не показан в вопросе.

Редактировать: ОК, теперь он отображается. Я бы предложил сначала очистить константную ссылку на проблемы с указателями и посмотреть, что осталось.

На самом деле вторая ошибка довольно ясна - либо аргументы конструктора R3MeshHalfEdge не должны быть ссылками на константные указатели (которые сообщают компилятору, что вы не собираетесь изменять объекты, на которые они указывают), или члены данных, которые вы присваивать эти аргументы должны сами указатели const.

1 голос
/ 22 февраля 2010

Вам нужно взглянуть на свой аргумент и пересмотреть, что должно быть постоянным, а что нет.

Ошибка вашего компилятора вызвана тем, что вы указываете неконстантный указатель (например, вершину) на постоянную память (аргумент вершины). В C ++ постоянные и непостоянные переменные имеют разные типы.

Прочитайте это для более подробной информации.

Если вы просто хотите, чтобы это работало, удалите все свои константы, и он скомпилируется. Если вы хотите, чтобы ваши аргументы были постоянными, вам придется копировать и присваивать данные (не указатели!), Чтобы устранить ошибку.

Кроме того, переименуйте свои аргументы, чтобы у вас не было конфликтов имен с вашими переменными-членами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...