为什么我在调用它时会得到对此类中方法的未定义引用?我是否会被迫将实现包含在头文件中,还是有另一种方法可以更好地完成这项工作?
class MathHelper
{
public:
/*!
Represents the ratio of the circumference of a circle to its diameter,
specified by the constant, p. This value is accurate to 5 decimal places.
*/
static const double pi = 3.14159;
template <typename T> static const T modulo(const T &numerator, const T &denominator);
static const double modulo(double numerator, double denominator);
static const float modulo(float numerator, float denominator);
template <typename T> static const T& clamp(const T &value, const T &min, const T &max);
template <typename T> static const T wrap(const T &value, const T &min, const T &max);
template <typename T> static bool isPowerOfTwo(T number);
template <typename T> static T nearestPowerOfTwo(T number);
static float aspectRatio(const QSize &size);
template <typename T> static float aspectRatio(T width, T height);
template <typename T> static T degreesToRadians(T degrees);
template <typename T> static T radiansToDegrees(T radians);
template <typename T> static T factorial(T n);
private:
MathHelper() { }
};
答案 0 :(得分:2)
我认为您的问题的解释和答案是C++ faq lite answer和the next ones
基本上,由于模板是实例化的模式,任何需要它的代码单元必须知道如何实现它。因此,最简单的方法是在头文件中定义模板(比如boost do)。 C ++ faq lite提供了另一种方法。我认为这很麻烦......
MY2C
答案 1 :(得分:0)
如果我们在相应的.cpp文件中定义了实现,那么我们可以使用显式实例化,以便编译器吐出正由程序其余部分使用的代码。
Ex: - 对于MathHelper,如果要使用int进行实例化
将语句template MathHelper<int>
添加到存在实现的相应.cpp文件中。
从方法论看,每次模板类与不同的参数一起使用时,必须明确地实例化这种方法。
但是我们从声明中获得了分离实现的所有好处,特别是当构建规模很大时。