我发现模板接口非常优雅,试图实现它面临着我无法解决的问题。我希望你能为我揭示一些事情。C++模板接口使用
我有类,例如,forge.h:
template<typename T> class Smelter;
template <typename T>
class Forge
{
long SmeltIt(vector<T>& ore)
{
long res;
Smelter<T> smelter;
for (const auto t : ore)
{
res += smelter.smelt(t);
}
return res;
}
};
随着模板类冶炼厂没有与任何实现实现和模板类伪造。
现在,当我想补充类铁,我需要创建iron.h和实施冶炼厂使用它,这样iron.h:
#include "forge.h"
class Iron {};
template<>
class Smelter<Iron>
{
long smelt(const Iron& iron) { return 5; }
};
int main()
{
vector<Iron> ore;
Iron iron;
ore.push_back(iron);
ore.push_back(iron);
ore.push_back(iron);
Forge<Iron> forge;
cout << forge.SmeltIt(ore); //have to be 15
}
如果所有这些东西是一个头文件,一切都完美的作品。但是,如果我创建iron.h,我尝试实施冶炼厂,编译器无法找到模板类冶炼厂。如果我在forge.h和iron.h中创建冶炼厂声明副本,那么它们会相互冲突。
什么是最好的解决方案呢?如果我能够在其他文件中实现我的模板界面,这将是非常有用的。如果没有这样的模板接口会变得很难看,例如,如果forge.h是在项目之间有线使用的工具,并且iron.h是我目前的专业化。
结果: 一切都按预期工作,问题在名称空间中描述的问题之外。所有的模板,即使可以在不同的文件之间分开它们(这是个问题) - 完美的工作。但是他们必须共享相同的命名空间。
我修复了代码错误。您可以在使用2个文件时显示编译器输出的错误吗? – Synxis
非常感谢您解决代码错误(我直接在这里写的),并要求显示错误。当我开始改变问题并添加错误时,我发现我的错误在哪里。命名空间是非常愚蠢的错误。基本模板是在名称空间内声明的,不是儿童。有一个问题。 – Arkady