Контейнер указателей - PullRequest
2 голосов
/ 16 июня 2009

У меня возникли проблемы с объявлением набора указателей STL на экземпляры классов. Более конкретно, у меня есть такой сценарий:

class SimulatedDiskFile {
  private:
    // ...
  public:
    // ...
    struct comparator {
      bool operator () (SimulatedDiskFile* const& file_1, SimulatedDiskFile* const& file_2) {
        return ((*file_1)->getFileName() < (*file_2)->getFileName());
      }
    };
}

typedef set<SimulatedDiskFile*, SimulatedDiskFile::comparator> FileSet;

Код выше не работает. Компилятор говорит, что не нашел члена функции SimulatedDiskFile :: comptor (). Если я помещу функцию с этим объявлением (вне структуры), компилятор говорит, что ожидал тип.

Теперь вот мои сомнения (не только одного, но, я думаю, связанные):

  • Что такое правильное объявление для набора указателей?
  • Как правильно объявить функцию сравнения, которая сравнивает указатели?

До публикации я действительно смотрел во многих местах, но обнаружил, что ссылки сбивают с толку и не совсем связаны с моим особым случаем (настолько глупо, насколько мне кажется, на самом деле, может быть, в этом причина) Так что любые хорошие ссылки тоже очень помогают!

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 16 июня 2009

Исправление нескольких глюков,

#include <set>

class SimulatedDiskFile {
  public:
    int getFileName() { return 23; }

    struct comparator {
      bool operator () (SimulatedDiskFile* file_1, SimulatedDiskFile* file_2) {
        return (file_1->getFileName() < file_2->getFileName());
      }
    };
};

typedef std::set<SimulatedDiskFile*, SimulatedDiskFile::comparator> FileSet;

компилируется просто отлично.

1 голос
/ 16 июня 2009

Поскольку вы не показываете, где должен быть метод getFileName (), я просто собираюсь выйти на конечность и предположить, что вы не хотите дважды разыменовывать свои указатели в компараторе , т.е. вы должны сделать либо:

return (file_1->getFileName() < file_2->getFileName());

или

return ((*file_1).getFileName() < (*file_2).getFileName());

но не оба.

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