2014-06-09 109 views
0

我发现模板接口非常优雅,试图实现它面临着我无法解决的问题。我希望你能为我揭示一些事情。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是我目前的专业化。

结果: 一切都按预期工作,问题在名称空间中描述的问题之外。所有的模板,即使可以在不同的文件之间分开它们(这是个问题) - 完美的工作。但是他们必须共享相同的命名空间。

+0

我修复了代码错误。您可以在使用2个文件时显示编译器输出的错误吗? – Synxis

+0

非常感谢您解决代码错误(我直接在这里写的),并要求显示错误。当我开始改变问题并添加错误时,我发现我的错误在哪里。命名空间是非常愚蠢的错误。基本模板是在名称空间内声明的,不是儿童。有一个问题。 – Arkady

回答

1

解决一些小问题后,你的代码编译得很好(使用clang 3.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; 
} 
+0

是的,这正是我所拥有的,我所描述的更高(但是有固定的错误,thx!)。问题在于命名空间和我的失明,所以一切都很完美。 – Arkady