2013-08-02 1 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"을 입력 한 다음 필요에 따라 템플릿을 인스턴스화합니다.

파일에서도 클래스 정의 안에 정의 된 인라인 함수를 사용할 필요가 없습니다. 그래서 다음 코드에서 아무 것도 명시 적으로 인라인되지 않습니다 :

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.h 파일에 넣고이 파일을 Math.h에 포함시킬 수 있습니다. 인라이닝에 대한 동일한 규칙이 적용됩니다. #include "Math.h" 또는 #include "Vector.h"을 입력하면 Vector 클래스 템플릿에 액세스 할 수 있습니다.

관련 문제