2

Можно ли частично создать экземпляр C++-шаблона?C++ шаблон частичного явного экземпляра

template class <typename T, int N> 
class MyClass { 
    ... 
}; 

template<int N> class MyClass<int, N>; // not meant for specification 
template<int N> class MyClass<float, N>; 

так же, как мы можем иметь:

template class <typename T> 
class MyClass { 
    ... 
}; 

template class MyClass<int>; 
template class MyClass<float>; 

ответ

5

шаблон не является классом. Это шаблон. (Проект построения класса). Он может стать только классом, когда учитываются все параметры шаблона.

написав этот (опечатка исправлена):

template <typename T, int N> 
class MyClass { 

}; 

Вы можете всеми средствами сделать это:

template<int N> class MyClass<int, N>; 
template<int N> class MyClass<float, N>; 

Но это не инстанцировании шаблон (потому что не имеет никакого значения), ни это создание экземпляра конкретного класса, сформированного из этого шаблона. То, что он на самом деле делает, - это форвардное объявление существования частично специализированного (возможно, бесконечного) подмножества шаблона.

Вы также можете сделать это:

template<int N> class MyClass<int, N> {}; 
template<int N> class MyClass<float, N> {}; 

который имеет частично специализированные MyClass для <int, [all values of N]> и <float, [all values of N]>.

Однако этот подмножество шаблонов все еще не создан. Всего определено.

Чтобы создать экземпляр шаблона, будь то частично специализированный или нет, мы должны назвать его, учитывая все аргументы шаблона.