我有一个模板类,我想与main.cpp文件分开,我将在那里进行测试等。我遇到的问题是没有简单的方法将模板类分成.h /。 cpp文件,因为编译器需要知道对象可能是哪种类型。
我遇到了this资源,我主要关注的是“方法2”。将.cpp文件包含在包含main的文件中是不好的做法? 我总是被告知它通常没有被修改,但这里最好的解决方案是什么?
答案 0 :(得分:2)
是的,这是不好的做法。
将它包含在相应的标题中也是不好的做法。
如果有人试图通过将所有.cpp
文件作为编译器的输入来编译项目,该怎么办?
良好的做法是使用特殊扩展名标记这些特殊文件,通常为.inl
。
答案 1 :(得分:2)
最佳:让类模板实现成为标题的一部分。
然后你有
如果在没有实现代码的情况下需要头文件的代码,则只将实现作为一个独立的文件分开。
因为如果不再需要代码实现,那么使用不同的文件就没有理由。
然而。如果你将实现分离为一个独特的文件,那么也要把它作为一个标题,因为这就是它的用法。它不打算单独编译。你不希望有一些太聪明的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”。