以下代码完美编译:
// 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
其他方法和函数的定义可以以相同的方式与声明分开。使用这种方法有什么缺点吗?可以依赖这种行为吗?
答案 0 :(得分:5)
注意:由于该文件是* .tpp文件(而不是* .cpp),因此其他构建系统操作不应包含该文件。如果您已手动添加它,请将其删除。
确保包含&lt; X&gt; .tpp的唯一地点是&lt; X&gt; .h
中的最后一行答案 1 :(得分:2)
如果您包含MyFile.tpp
(我从.cpp重命名),那么您不需要包含MyFile.h
。 #include
一个文件就像是将它的内容完全复制到包含它的文件中。除此之外,通常的做法是组织标题。 (虽然你不需要MyFile.tpp
中的包含警戒,因为它只能直接包含在另一个标题中(如GMan所说)。)