Почему разница в синтаксисе между явной и частичной специализацией? - PullRequest
3 голосов
/ 11 января 2012

Пример:

template <typename T, typename U>
struct A {
    void Print() {}
};

template <>
void A<int, float>::Print() {} // Okay                   

template <typename T>
void A<T, char>::Print() {} // Will produce error

Вопрос:

Я знаю, что вы должны определить частичную специализацию шаблона класса в приведенном выше коде, чтобы он работал, и я также знаю из стандарта, чтоThe members of the class template partial specialization are unrelated to the members of the primary template (§ 14.5.5.3).Однако, почему разница в синтаксисе между специализацией экспликации и частичной специализацией?

Ответы [ 2 ]

0 голосов
/ 11 января 2012
template <typename T>
void A<T, char>::Print() {} // Will produce error

Вы:

  1. переопределяете функцию (она уже была определена при объявлении void Print() {}, вы видите {}.
  2. ссписок аргументов шаблона, который не соответствует объявлению: template <typename T, typename U> void Print()

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

Функция специализированного шаблона для функции, связанной со структурой, должна иметьЭтот код работает также:

template <typename T, typename U>
struct A {
    void Print() {}
};

template <>
void A<int, float>::Print() {} // Okay                   


template <typename T>
struct A<T,char>
{
    void Print();
};

template <typename T>
void A<T,char>::Print() {}

Поскольку функция шаблона была объявлена ​​в ее структуре шаблона.

0 голосов
/ 11 января 2012

Вы не можете специализировать шаблоны функций частично, только полностью.

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

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

...