클래스 내에서 템플릿 함수를 만드는 방법은 무엇입니까? (C ++)


144

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

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(){}
};

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

답변:


115

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


3
또한 당신은 그들을 전문화 할 수 없습니다. :-(
— Frank Krueger

7
사실이 아닙니다. 정의되지 않은 템플릿 / 함수에서 고유 한 템플릿 매개 변수 n-uplet 각각에 대해 한 번만 호출되는 한, 정의는 cpp 파일에있을 수 있습니다.
— Benoît 2016 년

1
따라서 내 "필수"-헤더에 유지하는 것이 가장 간단한 방법입니다.
— 확실하지 않습니다

4
실제로는 명시 적으로 특수화 할 수 있지만 부분적으로 특수화 할 수는 없다고 생각합니다. 불행히도 이것이 컴파일러 특정 확장인지 또는 C ++ 표준인지 모르겠습니다.
— Patrick Johnmeyer

7
실제로 표준 C ++입니다. struct A {template <typename> void f (); }; 예를 들어 template <> void A :: f <int> () {}입니다. 클래스 범위에서 특수화 할 수는 없지만 네임 스페이스 범위에서 수행하면 잘 수행 할 수 있습니다. (전문화가 실제로 적용되는 범위와 혼동하지 말아야한다 : 전문화는 여전히 클래스의 멤버 일 것이다. 그러나 그 정의는 네임 스페이스 범위에서 수행된다. 어떤 것이 정의 되었으나 모든 경우에 있어서는 동급이 아닌 정의 에서처럼 사실이 아닙니다.)
— Johannes Schaub-litb

70

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

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

좋은 예입니다. 하지만 왜 template <typename T>가 클래스 definitino 안에 있습니까?
— Martian2049 2016 년

@ Martian2049 이것이 템플릿이므로 클래스 전체의 멤버 함수가 아닌 클래스 내의 멤버 함수에만 적용됩니다. OP가 요청한대로 정확하게.
— CBK

21

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

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


9

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

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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.