我发现模板界面非常优雅,并且尝试实现它面临着我无法解决的问题。我希望你能帮我弄清楚。
我有课,例如,健忘。
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;
}
};用模板类熔炼没有任何实现和模板类Forge的实现。
现在,当我想添加class Iron时,我需要创建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
}如果所有这些东西都在one头文件中,那么一切都很完美。但是,如果我创建iron.h来实现冶炼厂,编译器就找不到模板类冶炼厂。如果我在健忘的h和iron.h中为冶炼厂创建声明副本,那么它们之间就会发生冲突。
最好的解决办法是什么?如果我能够在其他文件中实现我的模板界面,这将非常有用。如果没有这种模板接口,例如,如果忘记了.h是工具,可以在项目之间使用,而iron.h是我当前的专长。
结果:在名称空间中,一切都按预期工作,问题超出了所描述的问题。所有的模板,即使有可能在不同的文件(这是个问题)之间分离-完美地工作。但它们必须共享相同的名称空间。
发布于 2014-06-09 11:11:55
在修复了一些小问题之后,您的代码就可以很好地编译(使用clang3.3)并产生所需的结果。以下是固定的代码(在一个文件中,但按#include的顺序排列)
template<typename T> class Smelter;
template <typename T>
class Forge
{
public:
long SmeltIt(std::vector<T>& ore) // must be public; use std::
{
long res{}; // must be initialized (to 0)
Smelter<T> smelter;
for (const auto t : ore)
res += smelter.smelt(t);
return res;
}
};
class Iron {};
template<>
class Smelter<Iron>
{
public:
long smelt(const Iron& iron) // must be public
{ return 5; }
};
int main()
{
std::vector<Iron> ore; // std::
Iron iron;
ore.push_back(iron);
ore.push_back(iron);
ore.push_back(iron);
Forge<Iron> forge;
std::cout << forge.SmeltIt(ore) // have to be 15
<< std::endl;
}https://stackoverflow.com/questions/24118285
复制相似问题