模板循环包含

问题描述 投票:0回答:2

以下代码可以完美编译:

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

其他方法和函数的定义可以用同样的方式从声明中分离出来。 使用这种方法有什么缺点吗? 这种行为可以信赖吗?

c++ templates linker
2个回答
6
投票
  • 将文件“MyFile.cpp”重命名为“MyFile.tpp”。
  • 从“MyFile.tpp”中删除包含防护
  • 更改“MyFile.h”中的包含内容,使其成为“MyFile.tpp”
  • 删除“MyFile.tpp”中的包含内容

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

确保唯一包含 .tpp 的位置是 .h

中的最后一行

2
投票

如果您包含

MyFile.tpp
(我将其从 .cpp 重命名),那么您不需要包含
MyFile.h
#include
创建文件就像将其内容完全复制到包含它的文件中一样。除此之外,对标题进行一些组织是一种常见的做法。 (尽管您不需要
MyFile.tpp
中的包含防护,因为它应该只直接从另一个标头包含(就像 GMan 所说的那样)。)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.