2013-08-02 23 views
0

我一直在C++中学习模板,他们看起来非常方便。但是,在底部http://www.cplusplus.com/doc/tutorial/templates/的大型多文件项目中使用模板时存在一些问题:“由于模板是在需要时编译的,因此这会强制限制多文件项目:实现(定义)模板类或函数必须与其声明位于同一个文件中。“如何正确使用跨多文件项目的模板?

所以,举个例子,想要写一个关于T类型名称运行的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函数,因为它们在头文件中?

回答

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; 
} 

注意:如果向量是一个非模板类的信息getX功能需要进行内联。其中,模板类的成员函数不需要内联。 有关更多信息,请参阅here

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

相关问题