2009-06-16 3 views
2

У меня возникли проблемы с объявлением набора указателей 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 :: comparator(). Если я поставлю функцию с этим объявлением (вне структуры), компилятор говорит, что он ожидал тип.

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

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

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

Заранее благодарен!

+0

Скомпилирует для меня (на g ++), за исключением того, что у вас есть ошибка в сравнении, потому что вы оба разыскиваете указатели, а затем также используете косвенные действия. –

ответ

5

Крепление несколько глюков,

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

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

+0

Попытался изменить синтаксис, чтобы получить его таким образом. Точно не компилируется, точное сообщение - «g ++ -Wall -g -c modules/sources/model.cpp -o obj/model.o modules/sources/model.cpp: 56: error: no 'bool SimulatedDiskFile :: compator (SimulatedDiskFile * const &, SimulatedDiskFile * const &) ', объявленная в классе' SimulatedDiskFile '' –

+0

@Rafael: Этот образец тоже отлично подходит для меня. Возможно, вы могли бы разместить более полный сегмент своего кода, который на самом деле воспроизводит конкретную ошибку? – goldPseudo

+0

Да @ Rafael, как и @goldPseudo, - ваша точная командная строка в этом точном фрагменте, который я дал (скопирован и вставлен в файл), с удовольствием компилируется (с несколькими версиями g ++ тоже). Пожалуйста, сделайте это, скопируйте и вставьте его и попробуйте подтвердить, что у вас нет разбитого g ++ ;-), а затем отредактируйте свой ответ, чтобы показать минимальный полный неудачный случай! –

1

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

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

или:

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

, но не оба.

+0

Привет! Пожалуйста, прочитайте комментарий к ответу Алекса! –

Смежные вопросы