5

这是家庭作业,虽然它已经用不同的方法提交了。

我从 Visual Studio 2008 得到以下信息

错误 C2893:无法专门化函数模板 'void std::sort(_RanIt,_RanIt,_Pr)'

代码如下

主文件
    数据库<>数据库;
    db.loadDatabase();
    db.sortDatabase(sort_by_title());  

数据库.cpp
无效数据库<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;
};

结构排序依据标题:公共排序依据{
    bool operator()(const Media *l, const Media *r) const { ... }
};
...

这里有什么药?

[编辑]对不起,也许我应该明确继承

模板 <typename C = std::vector<Media *> >
类数据库:公共 IDatabase<C>

[/编辑]

[Edit2]
在工具箱的建议(这似乎很合理)之后,我得到了以下错误消息

错误 C2664:“Database<>::sortMedia”:无法将参数 1 从“sort_by_title”转换为“const sort_by &”

main.cpp 仍然是相同的,但对函子层次结构和源文件进行了一些细微的修改。前向声明等不起作用,所以我不得不将定义放在单独的文件中。

搜索.h
结构 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 {
        返回 (*sbp)(l, r);
    }
};

数据库.h
结构 sort_by_title :公共 sort_by_impl {
    bool operator()(const Media *l, const Media *r) const {
        返回 (l->getTitle() < r->getTitle());
    }
};

我真的不明白这一点,我在这里错过了什么?一些转换操作,还是什么?
[/编辑2]

[Edit3]
我希望是最后也是最后的编辑。在调试和重写一些代码之后,我实际上得到了这个工作。这就是我最终的结果,这是我能做的最好的

类 sort_by : public std::binary_function<const Media *, const Media *, bool> {
上市:
    sort_by(sort_by_impl *sbp) : sbp_(sbp) {};
    bool operator()(const Media *l, const Media *r) const {
        返回 (*sbp_)(l, r);
    }
私人的:
    sort_by_impl *sbp_;
};

主文件
    db.sortDatabase(&sort_by_title());

数据库.cpp
无效数据库<C>::sortDatabase(const sort_by &s) {
    std::sort(db_.begin(), db_.end(), s);

这似乎有效,无论是在一个单独的项目(今天大部分时间都在搞砸这个)和我几天前提交的实际项目中。
非常感谢您的时间和帮助!
[/编辑3]

4

1 回答 1

8

我不确定这是导致问题的原因,因为它与 specialization 无关std::sort,但sortDatabase你不应该传入一个旨在表现多态的函子。原因是它std::sort按值接受你的函数对象,这意味着它被复制为一个sort_by对象,而不是它实际上是什么(即你有一个切片问题)。

如果你希望函数对象有一个 virtual 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_sortis of type ,它是 of - not of typesort_by_title的派生形式。这意味着您实际上想要传递一个对象中的指针,这是您将使用的实际函数对象。为了显示:sort_by_implsort_bymy_sortsbpsort_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;

顺便说一句,代码不是异常安全的;考虑用引用计数智能指针替换 sbp。或者更简单,只需sort_by_title在堆栈上声明并传入它的地址。请注意不要让它在使用前被破坏。:)

希望这会有所帮助。让我知道结果如何!

于 2011-01-07T23:48:10.710 回答