首页 文章

无法专门化功能模板

提问于
浏览
5

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

我从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]

[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]

1 回答

  • 8

    我'm not sure this is what'导致了这个问题,因为它与专门化 std::sort 无关,但是在 sortDatabase 你不应该't be passing in a functor that' s意味着表现多态 . 原因是 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 可以是您的抽象基类,特定的排序函数对象从中派生和覆盖 . 希望有所帮助 .

    EDIT

    基于新的错误消息,如果我不得不猜测,你正试图在 sortMedia 内做这样的事情:

    Database<std::vector<Media*> > db; // initialized elsewhere...
    
    sort_by_title my_sort;
    db.sortDatabase(my_sort);
    

    问题是 my_sort 的类型为 sort_by_title ,它是 sort_by_implsort_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 并传入其地址即可 . 注意不要在使用之前将其销毁 . :)

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

相关问题