使用C ++模板方法对函数的未定义引用

时间:2010-06-24 08:29:25

标签: c++ templates

为什么我在调用它时会得到对此类中方法的未定义引用?我是否会被迫将实现包含在头文件中,还是有另一种方法可以更好地完成这项工作?

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() { }
};

2 个答案:

答案 0 :(得分:2)

我认为您的问题的解释和答案是C++ faq lite answerthe next ones

基本上,由于模板是实例化的模式,任何需要它的代码单元必须知道如何实现它。因此,最简单的方法是在头文件中定义模板(比如boost do)。 C ++ faq lite提供了另一种方法。我认为这很麻烦......

MY2C

答案 1 :(得分:0)

如果我们在相应的.cpp文件中定义了实现,那么我们可以使用显式实例化,以便编译器吐出正由程序其余部分使用的代码。

Ex: - 对于MathHelper,如果要使用int进行实例化 将语句template MathHelper<int>添加到存在实现的相应.cpp文件中。

从方法论看,每次模板类与不同的参数一起使用时,必须明确地实例化这种方法。

但是我们从声明中获得了分离实现的所有好处,特别是当构建规模很大时。