【问题标题】:Failed to specialize function template未能专门化功能模板
【发布时间】:2011-06-05 13:56:47
【问题描述】:

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

我从 Visual Studio 2008 得到以下内容

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

代码如下

主文件 数据库数据库; db.loadDatabase(); db.sortDatabase(sort_by_title()); 数据库.cpp 无效数据库::sortDatabase(const sort_by &s) { std::sort(db_.begin(), db_.end(), s); }

而函数对象定义为

struct sort_by : public std::binary_function { virtual bool operator()(const Media *l, const Media *r) const = 0; }; 结构排序依据标题:公共排序依据{ bool operator()(const Media *l, const Media *r) const { ... } }; ...

这里有什么治疗方法?

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

模板 > 类数据库:公共 IDatabase

[/编辑]

[编辑2]
在 Toolbox 的建议(这似乎很合理)之后,我得到了以下错误消息

错误 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 { 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() getTitle()); } };

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

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

类 sort_by : public std::binary_function { 民众: 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 无效数据库::sortDatabase(const sort_by &s) { std::sort(db_.begin(), db_.end(), s);

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

【问题讨论】:

  • db_的类型是什么?
  • 可能是我不熟悉的模板的一个方面,但您不需要在第一行提供一些模板参数吗? Database<> db;
  • Oli,模板专门用于派生类。 IDatabase 应被视为接口/抽象基类,其中派生类实现特定类型的方法 - std::list、std::vector 或 ...C 是 IDatabase 中的成员(内部容器)跨度>
  • @citizencane 所以要明确一点……你们是不是同时派生了 IDatabase 和专门化了模板类 IDatabase?
  • @Ninefingers,是的。我认为让 IDatabase 充当接口并让派生类提供容器和特定于该容器的所有操作是一个好主意。

标签: c++ inheritance specialization functor template-specialization


【解决方案1】:

我不确定这是导致问题的原因,因为它与专门化 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_sortsort_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 并传入它的地址。请注意不要让它在使用前被破坏。 :)

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

【讨论】:

  • 感谢您的建议!我试过了,但我遇到了另一个错误。我试图修改代码,但我在这里做不到。还有其他建议吗?我已经编辑了我的帖子。
  • 非常感谢 - 您非常有帮助!解决并接受。 :-)
猜你喜欢
  • 2014-05-13
  • 2021-06-12
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
相关资源
最近更新 更多