В C ++, после того как мы объявим шаблон, мы можем специализировать его, если захотим, например ::
template <typename T> foo;
template <typename U> foo<U*>;
компилятор теперь ожидает другое определение для типов указателей. Но - специализация должна фактически специализироваться - она не может быть такой же общей, как первоначальная декларация. В вашем случае вы добавляете параметр шаблона. Дело даже не в его умозаключении - это просто не то, что ты можешь сделать.
Таким образом, если вы посмотрите на сообщения об ошибках , другие компиляции дадут вам :
(лязг:)
<source>:7:8: error: class template partial specialization does not specialize any template argument; to define the primary template, remove the template argument list
struct MyClass<T> {
^ ~~~
<source>:6:1: error: too many template parameters in template redeclaration
template <typename T, std::size_t sz>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(MSVC:)
<source>(11): error C2753: 'MyClass<T>': partial specialization cannot match argument list for primary template
<source>(11): error C2764: 'sz': template parameter not used or deducible in partial specialization 'MyClass<T>'
Вы увидите различную направленность в риторике сообщения об ошибке: вы должны специализироваться, а вы нет.
С другой стороны, во втором фрагменте кода вы специализируете : теперь вы не определяете MyClass
для всех типов T
, а только для массивов с определенным количеством элементов , Вы должны действительно думать об этом как:
template <typename U, std::size_t sz>
struct MyClass<U[sz]> {
static void print() {
std::cout << "Partially specialized" << std::endl;
}
};
, поэтому специализация - это когда T
имеет форму U[sz]
.