글쓴이 보관물: 소장 마

클래스 내에서 템플릿 함수를 만드는 방법은 무엇입니까? (C ++) 수 있습니다. template<typename T> class Object { public:

템플릿 기능을 만드는 것이 가능하다는 것을 알고 있습니다.

template<typename T>
void DoSomeThing(T x){}

템플릿 클래스를 만들 수 있습니다.

template<typename T>
class Object
{
public:
    int x;
};

그러나 템플릿 내에 클래스가 아닌 클래스를 만든 다음 해당 클래스의 함수를 템플릿으로 만들 수 있습니까? 즉 :

//I have no idea if this is right, this is just how I think it would look
class Object
{
public:
    template<class T>
    void DoX(){}
};

또는 클래스가 템플릿의 일부가 아니지만 기능이있는 정도까지?



답변

당신의 추측은 맞습니다. 당신이 기억해야 할 유일한 것은 멤버 함수 템플릿이다 정의 는 않지만 (선언 이외에)이, 헤더 파일이 아닌 CPP에 있어야 하지 클래스 선언 자체의 본문에 있어야합니다.


답변

여기 참조 : 템플릿 , 템플릿 메서드 , 멤버 템플릿, 멤버 함수 템플릿

class   Vector
{
  int     array[3];

  template <class TVECTOR2>
  void  eqAdd(TVECTOR2 v2);
};

template <class TVECTOR2>
void    Vector::eqAdd(TVECTOR2 a2)
{
  for (int i(0); i < 3; ++i) array[i] += a2[i];
}


답변

예, 템플릿 멤버 함수는 여러 경우에 완벽하게 합법적이고 유용합니다.

유일한 경고는 템플릿 멤버 함수가 가상 일 수 없다는 것입니다.


답변

가장 쉬운 방법은 선언과 정의를 같은 파일에 넣는 것이지만 크기가 큰 실행 파일이 발생할 수 있습니다. 예 :

class Foo
{
public:
template <typename T> void some_method(T t) {//...}
}

또한 템플릿 정의를 별도의 파일에 넣을 수 있습니다. 즉, .cpp 및 .h 파일에 넣을 수 있습니다. 템플릿 인스턴스화를 .cpp 파일에 명시 적으로 포함하기 만하면됩니다. 예 :

// .h file
class Foo
{
public:
template <typename T> void some_method(T t);
}

// .cpp file
//...
template <typename T> void Foo::some_method(T t)
{//...}
//...

template void Foo::some_method<int>(int);
template void Foo::some_method<double>(double);


답변