Это домашнее задание, хотя оно уже представлено с другим подходом.
Я получаю следующее от Visual Studio 2008
error C2893: Failed to specialize function template 'void std::sort(_RanIt,_RanIt,_Pr)'
Код выглядит следующим образом
main.cpp
Database<> db;
db.loadDatabase();
db.sortDatabase(sort_by_title());
Database.cpp
void Database<C>::sortDatabase(const sort_by &s) {
std::sort(db_.begin(), db_.end(), s);
}
И функциональные объекты определены как
struct sort_by : public std::binary_function<const Media *, const Media *, bool> {
virtual bool operator()(const Media *l, const Media *r) const = 0;
};
struct sort_by_title : public sort_by {
bool operator()(const Media *l, const Media *r) const { ... }
};
...
Какое лекарство здесь?
[Изменить]
Извините, может быть, я должен был сделать наследство ясным
template <typename C = std::vector<Media *> >
class Database : public IDatabase<C>
[/ Edit]
[Edit2]
После предложения от Toolbox (которое казалось очень разумным) я получил следующее сообщение об ошибке
error C2664: 'Database<>::sortMedia' : cannot convert parameter 1 from 'sort_by_title' to 'const sort_by &'
main.cpp остается тем же, но с некоторыми небольшими изменениями в иерархии функторов и исходных файлах. Предварительные объявления и тому подобное не работали, поэтому мне пришлось поместить определения в отдельные файлы.
Search.h
struct sort_by_impl {
virtual bool operator()(const Media *l, const Media *r) const = 0;
};
struct sort_by : public std::binary_function<const Media *, const Media *, bool> {
sort_by_impl *sbp;
bool operator()(const Media *l, const Media *r) const {
return (*sbp)(l, r);
}
};
IDatabase.h
struct sort_by_title : public sort_by_impl {
bool operator()(const Media *l, const Media *r) const {
return (l->getTitle() < r->getTitle());
}
};
Я правда не ворчу, что мне здесь не хватает? Какая-то операция преобразования или как?
[/ Edit2]
[Edit3]
Последнее и окончательное редактирование, я надеюсь. Я на самом деле получил это после отладки и переписывания кода. Это то, чем я закончил, и это лучшее, что я мог сделать
class sort_by : public std::binary_function<const Media *, const Media *, bool> {
public:
sort_by(sort_by_impl *sbp) : sbp_(sbp) {};
bool operator()(const Media *l, const Media *r) const {
return (*sbp_)(l, r);
}
private:
sort_by_impl *sbp_;
};
main.cpp
db.sortDatabase(&sort_by_title());
Database.cpp
void Database<C>::sortDatabase(const sort_by &s) {
std::sort(db_.begin(), db_.end(), s);
Кажется, это работает, как в отдельном проекте (потратив большую часть этого дня на это), так и в моем реальном проекте, который я представил несколько дней назад.
Большое спасибо за ваше время и помощь!
[/ Edit3]