在我的C ++项目中,我最近偶然发现了一个小问题:模板。
我在我的头文件(由每个.cpp共享)中声明了一个类Data,并为它提供了一个模板函数。我在data.cpp中实现了它。我很快就记得模板是如何在现场编译的,当它们被引用时,这会打破使用.h和.cpp文件完成的声明/实现分离。
所以我想通过以下方式做一些工作:
class Data {
template<typename T> void myFunc(T in);
};
#define __DATA_TEMPLATE_IMPL
#include "Data.cpp"
#undef __DATA_TEMPLATE_IMPL
在header.h中:
#ifndef __DATA_TEMPLATE_IMPL
// non-template functions and other stuff....
#else
template<typename T>
void Data::myFunc(T in) {
// implementation of template function
}
#endif
这是一个很大的解决方法,对于编译器来说,好像#else
和#endif
之间的代码移动到头文件中。
两个问题:
你觉得这有什么问题吗?你能想出任何可能是错误的,不合适的或其他什么原因吗?
有没有更好的方法(除了实际将实现放在头文件中)?
答案 0 :(得分:2)
你觉得这有什么问题吗? 你能想到这可能有什么原因吗? 是错的,不合适的还是其他什么?
是
您的构建工具将是:
对于其他开发人员来说,在他们理解您的代码之前必须先发现这一点。
有没有更好的方法(除了实际将实现放在头文件中)?
更好的方式是什么?你想解决一个实际问题吗?如果是这样,可能有很多方法可以解决它。如果你的问题只是对不雅的挫败感,那就继续......生命太短暂。
答案 1 :(得分:1)
这在技术上没有任何错误,编译器不会在乎。然而,将模板代码粘贴在头文件中是很常见的,也就是说,没有令人信服的理由将其放在CPP文件中。
关于“所有功能”是模板功能的评论。这是低效率可能开始显示的地方,也就是你怀疑的那种。我知道大多数编译器编译模板比普通代码慢。此外,由于所有内容都在标题中,因此每个源单元都有更多要解析的代码,从而进一步降低了速度。我不是说不使用模板,但要注意它们没有编译时间。