다음을 통해 공유


템플릿 지정

template 선언에서는 매개 변수화된 클래스 또는 함수 집합을 지정합니다.

template < template-parameter-list > declaration

설명

다음 템플릿-매개 변수-목록 은 템플릿 매개 변수를 쉼표로 구분 된 목록입니다. 클래스 식별자, typename 식별자, 또는 템플릿 < 템플릿 매개 변수 목록 > 클래스 식별자) 또는 비형식 매개 변수를 템플릿 본문에 사용할 수 있습니다. 템플릿 매개 변수 구문은 다음과 같습니다.

parameter-declaration
class identifier [ = typename ] 
typename identifier [ = typename ]
template < template-parameter-list > class [identifier][= name]

일반 클래스보다 훨씬 더 클래스 템플릿을 인스턴스화 할 수 있지만, 꺾쇠 괄호 (<>) 안에 템플릿 인수를 포함하여야 합니다. 만약 템플릿 인수 목록이 클래스이나 typename 키워드를 포함하고 있다면, 이 템플릿 인수들은 어느 유형이 될 수 있거나, 만약 인수가 비유형 인수라면, 적합한 유형의 값이 될 수 있습니다. 템플릿 매개 변수가 인수에서 함수로 추론될 수 없는 경우 꺾쇠 괄호와 템플릿 인수가 필요할 수 있지만 함수 템플릿을 호출하는 데는 특수 구문이 필요하지 않습니다.

템플릿-매개 변수-목록은 코드의 어느 부분이 달라지는 지정된 템플릿 함수에 의해 사용되어 지는 매개 변수 목록입니다. 예를 들면 다음과 같습니다.

template< class T, int i > class MyStack...

이 경우 템플릿은 class T 형식과 int i라는 상수 매개 변수를 받을 수 있습니다. 템플릿은 인스턴스화할 때 T 형식 및 정상수 i 를 사용합니다. MyStack 선언의 본문 내에 T 식별자를 참조해야 합니다.

템플릿 선언 자체는 코드를 생성하지 않습니다. 클래스 또는 함수의 패밀리를 지정하고 이 중 하나 이상은 다른 코드에 의해 참조될 때 생성됩니다.

템플릿 선언에는 전역, 네임스페이스 또는 클래스 범위가 있습니다. 이들은 함수 내에서는 선언할 수 없습니다.

다음 예제에서는 형식 매개 변수 T와 비형식 템플릿 매개변수 i로 클래스 템플릿의 인스턴스화, 선언 및 정의를 보여줍니다.

// template_specifications1.cpp
template <class T, int i> class TestClass 
{
public:
   char buffer[i];
   T testFunc(T* p1 );
};

template <class T, int i>
T TestClass<T,i>::testFunc(T* p1) 
{
    return *(p1++)
};

// To create an instance of TestClass
TestClass<char, 5> ClassInst;
int main()
{
}

비 형식 템플릿 인수

비형식 템플릿 매개 변수는 정수 계열, 열거형, 포인터, 참조 또는 멤버 형식에 대한 포인터여야 하고 컴파일 타임에 상수여야 합니다. 이들은 Const 또는 volatile 형식으로 정규화될 수 있습니다. 부동 소수점 값은 템플릿 매개 변수로 사용할 수 없습니다. 클래스, 구조체 또는 공용 구조체 형식의 개체는 비형식 템플릿 매개 변수로 허용되지 않지만 이러한 개체에 대한 포인터는 허용됩니다. 비형식 템플릿 매개 변수로 전달되는 배열은 포인터로 변환됩니다. 비형식 매개 변수로 전달된 함수는 함수 포인터로 간주됩니다. 문자열 리터럴은 템플릿 매개 변수로 사용할 수 없습니다.

템플릿 선언에서 형식 이름 사용

다음 typename 키워드는 템플릿 매개 변수 목록에서 사용할 수 있습니다. 다음 템플릿 선언은 동일합니다.

template< class T1, class T2 > class X...
template< typename T1, typename T2 > class X...

템플릿 매개 변수에 대한 기본 인수

클래스 템플릿은 = 부호와 기본 형식 또는 값을 사용하여 기본 인수를 지정할 수 있습니다. 함수 템플릿에는 기본 인수를 사용할 수 없습니다. 자세한 내용은 클래스 템플릿의 기본 인수를 참조하십시오.

template<typename Type> class allocator {};
template<typename Type, 
   typename Allocator = allocator<Type> > class stack 
{
};
stack<int> MyStack;

템플릿 매개 변수 다시 사용

템플릿 매개 변수는 템플릿 매개 변수 목록에서 재사용할 수 있습니다. 예를 들어 다음 코드는 허용됩니다.

// template_specifications2.cpp

class Y 
{
};
template<class T, T* pT> class X1 
{
};
template<class T1, class T2 = T1> class X2 
{
};

Y aY;

X1<Y, &aY> x1;
X2<int> x2;

int main()
{
}

템플릿 매개 변수로서의 템플릿

템플릿 매개 변수 자체가 템플릿일 수 있습니다. 이 구문은 인수가 템플릿에서 만들어진 클래스가 아니라 그 자체가 템플릿이 되어야 함을 의미합니다. 다음 예제에서 템플릿 템플릿 매개 변수에 대한 템플릿 매개 변수의 이름 A는 사용 가능한 방법이 없기 때문에 생략할 수 있습니다.

// template_specifications3.cpp
#include <stdio.h>

template <class T> struct str1
{
   T t;
};

template <template<class A> class T> struct str2
{
    T<int> t;
};

int main()
{
    str2<str1> mystr2;
    mystr2.t.t = 5;
    printf_s("%d\n", mystr2.t.t);
}

Output

5

템플릿 매개 변수로서의 참조

Visual Studio .NET 2003에는 참조 비형식 템플릿 매개 변수로 사용하는 기능이 도입되었습니다. 이전 버전에서는 허용되지 않았습니다.

// references__supported_as_nontype_template_parameters.cpp
#include <stdio.h>

extern "C" int printf_s(const char*,...);
template <int & ri> struct S
{
   S()
   {
      printf_s("ri is %d\n", ri);
   }

   ~S()
   {
      printf_s("ri is %d\n", ri);
   }
};

int i = 1;

int main()
{
   S<i> s;
   i = 0;
}

Output

ri is 1
ri is 0

중첩된 템플릿 인스턴스

중첩된 템플릿 인스턴스를 선언할 때, Visual Studio 2005 이전의 Visual Studio 버전은 템플릿 매개 변수 목록 사이에 공백을 삽입해야 합니다. 다음 구문은 지금 사용할 수 있습니다.

// template_specifications4.cpp 

template <typename T> 
class A
{
};

template <int n> 
class B 
{
};

int main() 
{
   A<B<22>>();
}

참고 항목

참조

C++ 키워드

기타 리소스

템플릿