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

C++ 在模板类实现中分离.h和.cpp文件,c++,templates,C++,Templates,我正在尝试编写一个模板类,它可以根据我传递的来形成类。问题是我不能在同一个.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 /* T

我正在尝试编写一个模板类,它可以根据我传递的
来形成类。问题是我不能在同一个
.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_ */
Main.cpp

#include "Template.h"

template<class T>
T Template<T>::Add(T a, T b)
{
    return a+b;
}
#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;
}
#包括“Template.cpp”//这是一个好做法吗?
#包括
int main(int argc,字符**argv){
模板obj;

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


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

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


请参见

这并不是严格正确的。虽然将定义放入每个翻译单元是最方便的,因此也是最常见的做法,但这不是一个要求。@MarkRansom是的,你是对的。但是,能够“提前”完成所有必需的显式实例化是非常罕见的