我要做的事情:
// in foo.hpp
class foo {
private:
int m_a;
long m_b;
public:
foo(); // default constructor (defined in foo.cpp)
template<class T>
int Func1(int a, int b) {
// Func1 definition
// uses member variables m_a, m_b
}
}
// in foo.cpp
#include "foo.hpp"
foo::foo() {
// Foo constructor
// Uses member variables m_a, m_b
}
我理解C++中的模板是作为一种模式工作的,并且是按需实例化的。因此,为了让编译器了解发生了什么,模板方法定义需要在头文件中(否则我需要使用其他解决方法,如使用实现文件(.tpp(并将其包含在foo.hpp中(这也适用于具有非模板方法的模板类。需要在头文件中定义非模板方法。我的问题是Foo是一个正则类,有一个模板方法和一个正则构造函数。构造函数应该在头文件中定义,还是可以在单独的源文件中定义?
我在工作中遇到了这个问题。将构造函数定义移到头文件似乎可以解决这个问题。如果有人能对这种行为做出解释,那将是很有帮助的。
构造函数应该在头文件中定义,还是可以在单独的源文件中定义?
只要构造函数和类本身不是模板,就可以在任何地方定义它。
我想澄清的一点是:template
的定义只需要在实例化时可见。这实际上并不意味着template
必须始终在标头中定义;如果它的唯一用途是在源文件中内部化(例如,它是一个private
函数,仅在内部使用(,那么它也可以很容易地在源文件内定义。
这通常意味着,对于public
函数模板或类模板的情况,它应该在标头中,但此规则也有例外。