以下代码可以完美编译:
// MyFile.h
#ifndef MYFILE_H_INCLUDED
#define MYFILE_H_INCLUDED
template <typename Datatype>
class MyClass
{
public:
void MyMethod();
}
#include "MyFile.cpp"
#endif
// MyFile.cpp
#ifndef MYFILE_CPP_INCLUDED
#define MYFILE_CPP_INCLUDED
#include "MyFile.h"
template <typename Datatype>
void MyClass<Datatype>::MyMethod()
{
// ...
}
#endif
其他方法和函数的定义可以用同样的方式从声明中分离出来。 使用这种方法有什么缺点吗? 这种行为可以信赖吗?
注意:由于该文件是 *.tpp 文件(不是 *.cpp),因此不应包含在其他构建系统操作中。如果您已手动添加它,请将其删除。
确保唯一包含
如果您包含
MyFile.tpp
(我将其从 .cpp 重命名),那么您不需要包含 MyFile.h
。 #include
创建文件就像将其内容完全复制到包含它的文件中一样。除此之外,对标题进行一些组织是一种常见的做法。 (尽管您不需要 MyFile.tpp
中的包含防护,因为它应该只直接从另一个标头包含(就像 GMan 所说的那样)。)