0

我一直在学习 C++ 中的模板,它们看起来非常方便。但是,在http://www.cplusplus.com/doc/tutorial/templates/的最底部有一个关于在大型多文件项目中使用模板的问题的注释:“因为模板是在需要时编译的,所以这个强制限制多文件项目:模板类或函数的实现(定义)必须与其声明位于同一文件中。”

举个例子,想写一个对Ttypename 进行操作的 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这些函数,因为它们在头文件中?

4

1 回答 1

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函数。除此之外,模板类的成员函数不需要内联。请参阅此处了解更多信息。

当然,您可以将您的Vector类代码放在一个Vector.h文件中,并将该文件包含在Math.h. 关于内联的相同规则适用。然后#include "Math.h"#include "Vector.h"两者都会让您访问您的 Vector 类模板。

于 2013-08-02T23:46:09.970 回答