4

這是家庭作業,雖然它已經提交了不同的方法。功能模板專業化失敗

我越來越從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]

+2

什麼是db_的類型? – Puppy 2011-01-07 22:49:45

+0

也許這是我不熟悉的模板的一個方面,但是你不需要在第一行提供一些模板參數嗎? `Database <> db;` – 2011-01-07 22:59:06

回答

8

我不知道這是什麼造成的問題,因爲它沒有任何關係專業std::sort,但在sortDatabase你不應該通過在的意思表現多態仿函數。原因是std::sort按值接受你的函數對象,這意味着它被複製爲sort_by對象,而不是它實際上是什麼(即你有切片問題)。

如果你想要的功能對象有一個虛擬operator(),函數對象應該持有一個指向多態類,像這樣:

struct sort_by : public std::binary_function<const Media*, const Media*, bool> { 
    bool operator()(const Media *l, const Media *r) const 
    { 
     return (*p_impl)(l, r); 
    } 

    sort_by_impl* p_impl; 
}; 

然後,sort_by_impl可以成爲你的抽象基類,具體排序函數對象派生並覆蓋。希望有所幫助。

編輯

基於新的錯誤信息,如果要我猜,你試圖做這樣的事情裏面sortMedia

Database<std::vector<Media*> > db; // initialized elsewhere... 

sort_by_title my_sort; 
db.sortDatabase(my_sort); 

的問題是,my_sort是類型sort_by_title,它是sort_by_impl的派生形式 - 而不是的類型sort_by。這意味着你實際上想要通過my_sort成爲sort_by對象中的sbp指針,這是您將使用的實際函數對象。舉例說明:

Database<std::vector<Media*> > db; // initialized elsewhere... 

sort_by my_sort_fn; 
my_sort_fn.sbp = new sort_by_title; 
db.sortDatabase(my_sort_fn); 

delete my_sort_fn.sbp; 

順便說一句,代碼並不是例外安全的;考慮用引用計數智能指針替換sbp。或者更容易,只需在堆棧中聲明sort_by_title並傳遞其地址即可。請注意不要在使用之前銷燬它。 :)

希望有幫助。讓我知道結果如何!