我一直在学习C ++中的模板,它们看起来非常方便。但是,有一个关于在http://www.cplusplus.com/doc/tutorial/templates/最底层的大型多文件项目中使用模板的问题的说明:“因为模板是在需要时编译的,所以这会强制限制多文件项目:实现模板类或函数的(定义)必须与其声明在同一文件中。“
例如,想要编写一个在T
typename上运行的2D Vector类模板:
template <class T>
class Vector {
T x, y;
public:
Vector(T x, T y)
{
this->x = x;
this->y = y;
}
void normalize()
{
T length = sqrt(x * x + y * y);
x = x / length;
y = y / length;
}
};
我的问题很简单,你会在哪里放置这个模板,以便多个.cpp文件可以访问它?如果你把它放在一个Math.h文件中,你保存所有其他自定义数学相关的声明,你是否必须inline
这些函数,因为它们在头文件中?
答案 0 :(得分:2)
您可以按照建议将它们放在Math.h文件中。只要需要,您将#include "Math.h"
然后根据需要实例化模板。
即使在.h
文件中,您也不需要在内部类定义中定义内联函数。因此,在以下代码中,没有明确内联:
template <class T>
class Vector {
T x, y;
public:
Vector(T x, T y)
{
this->x = x;
this->y = y;
}
void normalize() //no need to inline (in fact, it's automatically inlined for you)
{
T length = sqrt(x * x + y * y);
x = x / length;
y = y / length;
}
T GetX();
};
template<class T> Vector<T>::GetX() { //outside class definition, also need not be inlined
return x;
}
注意:如果Vector是非模板化类,则需要内联GetX函数 。除此之外,模板类的成员函数不需要内联。 有关详细信息,请参阅here。
当然,您可以将Vector
类代码放在Vector.h
文件中,并将该文件包含在Math.h
中。关于内联的相同规则适用。然后#include "Math.h"
或#include "Vector.h"
都可以让您访问Vector类模板。