循环包含模板

时间:2011-03-29 04:08:53

标签: c++ templates compiler-construction linker

以下代码完美编译:

// 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

其他方法和函数的定义可以以相同的方式与声明分开。使用这种方法有什么缺点吗?可以依赖这种行为吗?

2 个答案:

答案 0 :(得分:5)

  • 将文件“MyFile.cpp”重命名为“MyFile.tpp”。
  • 从“MyFile.tpp”
  • 中删除包含警戒
  • 更改“MyFile.h”中的include,使其为“MyFile.tpp”
  • 删除“MyFile.tpp”
  • 中的include

注意:由于该文件是* .tpp文件(而不是* .cpp),因此其他构建系统操作不应包含该文件。如果您已手动添加它,请将其删除。

确保包含&lt; X&gt; .tpp的唯一地点是&lt; X&gt; .h

中的最后一行

答案 1 :(得分:2)

如果您包含MyFile.tpp(我从.cpp重命名),那么您不需要包含MyFile.h#include一个文件就像是将它的内容完全复制到包含它的文件中。除此之外,通常的做法是组织标题。 (虽然你不需要MyFile.tpp中的包含警戒,因为它只能直接包含在另一个标题中(如GMan所说)。)