如何在多文件项目中正确使用模板?

时间:2013-08-02 23:42:28

标签: c++ templates header-files

我一直在学习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这些函数,因为它们在头文件中?

1 个答案:

答案 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类模板。