다음을 통해 공유


템플릿 클래스 인스턴스화

클래스 템플릿을 인스턴스화할 때 함수 템플릿과 달리, 클래스 템플릿 인수를 지정하여 클래스를 명시적으로 인스턴스화해야 합니다. TempClass의 인스턴스를 만들려면

TempClass< float, 6 > test1;       // OK
TempClass< char, items++ > test2;  // Error, second parameter 
                                   // must be constant.

컴파일러는 클래스 또는 함수를 인스턴스화할 때 템플릿 클래스나 함수에 대한 코드를 생성합니다. 멤버 함수는 호출될 때 인스턴스화되며 가상 멤버 함수는 해당 클래스가 생성될 때 인스턴스화됩니다. 이것은 다른 사용자를 위해 템플릿으로 라이브러리를 빌드하는 경우에 문제를 일으킬 수 있습니다. 자세한 내용은 명시적 인스턴스화를 참조하십시오.

클래스 템플릿은 컴파일러에 의해 먼저 특수화된 다음 인스턴스화됩니다. 컴파일러는 이 템플릿 클래스의 멤버에 대한 참조가 만들어지거나, sizeof가 클래스에 대해 사용되거나, 인스턴스가 만들어질 때까지 클래스 템플릿을 인스턴스화하지 않습니다.

템플릿의 명시적 특수화는 특정 형식에 대한 사용자 지정된 버전의 템플릿입니다.

// template_instantiation2.cpp
template<class T> class X
{
};

// Explicit specialization of X with 'int'
template<> class X<int>
{
};
int main()
{
}

template<> 없는 명시적 특수화는 오류를 발생시킵니다. Visual C++ .NET 2003 이전 Visual C++ 버전은 이 구문을 허용했습니다.

// Explicit specialization of X with 'char'
class X<char> // C2906
{
};

템플릿이 명시적으로 인스턴스화되거나 특수화된 후에는 동일한 템플릿 인수 집합에 대해 동일한 프로그램에서 또 한 번 명시적으로 인스턴스화되거나 특수화될 수 없습니다. 다른 템플릿 인수를 사용하는 추가 특수화는 허용됩니다.

특정 템플릿 인수에 대한 명시적 인스턴스화 또는 특수화가 없는 경우 템플릿은 처음으로 사용된 지점에서 암시적으로 인스턴스화됩니다.

같은 템플릿의 다른 인스턴스화는 형식이 다르기 때문에 템플릿의 한 특수화 또는 인스턴스화에 대한 정적 멤버는 같은 템플릿의 다른 특수화 또는 인스턴스화를 위한 정적 멤버와 구분됩니다.

참고 항목

참조

클래스 템플릿