클래스 내에서 템플릿 함수를 만드는 방법은 무엇입니까? (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.