在模板类实现中分离.h和.cpp文件

时间:2013-03-22 18:32:48

标签: c++ templates

我正在尝试编写一个模板类,它可以根据我传递的<class>来形成类。问题是我无法在同一个.h文件中声明和定义。在我的项目中,UTF工具只能使用.cpp文件(代码覆盖等)。我在博客中看到他们说“添加.cpp而不是.h”。这是可取的吗?

Template.h

#ifndef TEMPLATE_H_
#define TEMPLATE_H_

template<class T>
class Template
{
public:
    T Add(T a,T b);
};

#endif /* TEMPLATE_H_ */

Template.cpp

#include "Template.h"

template<class T>
T Template<T>::Add(T a, T b)
{
    return a+b;
}

Main.cpp

#include "Template.cpp" //Is this a good practise? 
#include <iostream>

int main(int argc, char **argv) {
    Template<int> obj;
    std::cout<<obj.Add(3,4)<<std::endl;
}

如果不建议这样做,我该如何解决这个问题? export

2 个答案:

答案 0 :(得分:7)

编译器需要具有访问方法实现的权限才能实例化模板类,因此最常见的做法是 在头文件中包含模板的定义,声明该模板模板 在标题文件中定义

请参阅Why can templates only be implemented in the header file?

答案 1 :(得分:4)

必须在使用它们的每个翻译单元中定义模板。这意味着它们必须在头文件中定义。如果您的工具坚持使用扩展程序.cpp,您也可以提供它,就像您一样。

在这种情况下,您甚至不需要将伪标头拆分为.h.cpp。您可以将其全部放在.cpp#include中。