当您的实现文件是模板化类时,包含.cpp文件是不好的做法吗?

时间:2015-10-30 09:23:51

标签: c++

我有一个模板类,我想与main.cpp文件分开,我将在那里进行测试等。我遇到的问题是没有简单的方法将模板类分成.h /。 cpp文件,因为编译器需要知道对象可能是哪种类型。

我遇到了this资源,我主要关注的是“方法2”。将.cpp文件包含在包含main的文件中是不好的做法? 我总是被告知它通常没有被修改,但这里最好的解决方案是什么?

3 个答案:

答案 0 :(得分:2)

是的,这是不好的做法。

将它包含在相应的标题中也是不好的做法。

如果有人试图通过将所有.cpp文件作为编译器的输入来编译项目,该怎么办?

良好的做法是使用特殊扩展名标记这些特殊文件,通常为.inl

答案 1 :(得分:2)

最佳:让类模板实现成为标题的一部分。

然后你有

  • MyClass.hpp

如果在没有实现代码的情况下需要头文件的代码,则只将实现作为一个独立的文件分开。

因为如果不再需要代码实现,那么使用不同的文件就没有理由。

然而。如果你将实现分离为一个独特的文件,那么也要把它作为一个标题,因为这就是它的用法。它不打算单独编译。你不希望有一些太聪明的IDE来做到这一点。

然后,因为标题应该是自包含的,所以实现应该包含纯粹的声明性标题,如下所示:

  • MyClass.fwd.hpp
    纯粹的声明。

  • MyClass.hpp
    包括上面的纯标题。

这的结构非常类似于标准库的<ioswfd>,它对应于上面的MyClass.fwd.hpp。

答案 2 :(得分:1)

为什么不#include .cpp进入相应的.h?这将解决模板编译问题,同时遵循非模板化类的标准方法。

SomeClass.h

#ifndef SOMECLASS_H
#define SOMECLASS_H

template<class T>
class SomeClass { /* ... */ };

#include "SomeClass.cpp"

#endif

SomeClass.cpp

template<class T> SomeClass::foo() 
/*...*/

main.cpp

#include "SomeClass.h"

int main() { 
    /* ... */ 
}

请不要忘记您不需要实际编译您的SomeClass.cpp。正如其他人所建议的那样,您可以为实现文件选择不同的扩展名(而不是.cpp)。

UPD:在阅读你链接的文章时,我发现这被称为“方法3”。