cit*_*ane 5 c++ inheritance functor specialization template-specialization
这是家庭作业,虽然已经提交了不同的方法.
我从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]
在Toolbox的建议(看起来非常合理)后,我最终得到以下错误消息
error C2664: 'Database<>::sortMedia' : cannot convert parameter 1 from 'sort_by_title' to 'const sort_by &'
main.cpp仍然是相同的,但对functor层次结构和源文件稍作修改.前向声明等不起作用,所以我不得不将定义放在单独的文件中.
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]
[编辑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]
我不确定这是导致问题的原因,因为它与专门化没有任何关系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;
};
Run Code Online (Sandbox Code Playgroud)
然后,sort_by_impl可以是您的抽象基类,特定的排序函数对象从中派生和覆盖.希望有所帮助.
编辑
基于新的错误消息,如果我不得不猜测,你正在尝试做这样的事情sortMedia:
Database<std::vector<Media*> > db; // initialized elsewhere...
sort_by_title my_sort;
db.sortDatabase(my_sort);
Run Code Online (Sandbox Code Playgroud)
问题是my_sort类型sort_by_title,它是派生形式sort_by_impl- 不是类型sort_by.这意味着你实际上想要传递my_sort给对象中的sbp指针sort_by,这是你将使用的实际函数对象.为了显示:
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;
Run Code Online (Sandbox Code Playgroud)
顺便说一下,代码不是例外安全的; 考虑用引用计数智能指针替换sbp.或者更简单,只需sort_by_title在堆栈上声明并传入其地址即可.注意不要在使用之前将其销毁.:)
希望这会有所帮助.让我知道结果如何!