Это домашнее задание, хотя оно уже представлено с другим подходом.Не удалось специализировать шаблон функции
Я получаю следующее из 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 (который, казалось, очень разумно) I закончилось со следующим сообщением об ошибке
error C2664: 'Database<>::sortMedia' : cannot convert parameter 1 from 'sort_by_title' to 'const sort_by &'
main.cpp все тот же, но с некоторыми sli ght в иерархию функтора и исходные файлы. Передовые декларации и т. Д. Не работали, поэтому мне пришлось помещать определения в отдельные файлы.
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]
Какой тип db_? – Puppy
Возможно, это аспект шаблонов, с которыми я не знаком, но разве вам не нужно предоставлять некоторые аргументы шаблона в первой строке? 'База данных <> db;' –
Оли, шаблон специализирован в производном классе. База данных должна рассматриваться как базовый класс интерфейса/абстрактного класса, где производный класс реализует методы для конкретного типа - std :: list, std :: vector или ... 'C' является членом в базе данных (внутренний контейнер) – citizencane