這是家庭作業,雖然它已經提交了不同的方法。功能模板專業化失敗
我越來越從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>
[/編輯]
[EDIT2]
從工具箱中的建議(這似乎很合理)後,我結束與以下錯誤消息
error C2664: 'Database<>::sortMedia' : cannot convert parameter 1 from 'sort_by_title' to 'const sort_by &'
main.cpp仍然是一樣的,但與一些sli對仿函數層次結構和源文件進行修改。前向聲明等不起作用,所以我不得不將這些定義放在單獨的文件中。
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()); } };
我真的沒有想到這一點,我在這裏錯過了什麼?一些轉換操作,還是什麼?
[編輯3]
最後和最終的編輯,我希望。在調試和重寫一些代碼之後,我確實得到了這個工作。這是我結束了,這是最好的我所能做的
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 2011-01-07 22:49:45
也許這是我不熟悉的模板的一個方面,但是你不需要在第一行提供一些模板參數嗎? `Database <> db;` – 2011-01-07 22:59:06