【发布时间】:2011-06-05 13:56:47
【问题描述】:
这是家庭作业,虽然它已经用不同的方法提交了。
我从 Visual Studio 2008 得到以下内容
错误 C2893:无法专门化函数模板 'void std::sort(_RanIt,_RanIt,_Pr)'代码如下
主文件 数据库数据库; db.loadDatabase(); db.sortDatabase(sort_by_title()); 数据库.cpp 无效数据库而函数对象定义为
struct sort_by : public std::binary_function这里有什么治疗方法?
[编辑] 对不起,也许我应该明确继承
模板[/编辑]
[编辑2]
在 Toolbox 的建议(这似乎很合理)之后,我得到了以下错误消息
main.cpp 仍然是相同的,但对仿函数层次结构和源文件进行了一些细微的修改。前向声明等不起作用,所以我不得不将定义放在单独的文件中。
搜索.h 结构 sort_by_impl { virtual bool operator()(const Media *l, const Media *r) const = 0; }; struct sort_by : public std::binary_function我真的不明白这一点,我在这里错过了什么?一些转换操作,还是什么?
[/Edit2]
[编辑3]
最后和最后的编辑,我希望。在调试和重写一些代码之后,我实际上得到了这个工作。这就是我最终的结果,这是我能做的最好的事情
这似乎可行,无论是在一个单独的项目中(今天大部分时间都在搞砸这个),还是在我几天前提交的实际项目中。
非常感谢您的时间和帮助!
[/Edit3]
【问题讨论】:
-
db_的类型是什么?
-
可能是我不熟悉的模板的一个方面,但您不需要在第一行提供一些模板参数吗?
Database<> db; -
Oli,模板专门用于派生类。 IDatabase 应被视为接口/抽象基类,其中派生类实现特定类型的方法 - std::list、std::vector 或 ...
C是 IDatabase 中的成员(内部容器)跨度> -
@citizencane 所以要明确一点……你们是不是同时派生了 IDatabase 和专门化了模板类 IDatabase?
-
@Ninefingers,是的。我认为让 IDatabase 充当接口并让派生类提供容器和特定于该容器的所有操作是一个好主意。
标签: c++ inheritance specialization functor template-specialization