Информация об изменениях

Сообщение Re[3]: Специализация метода. Нужно устранить ошибку от 24.08.2022 10:30

Изменено 24.08.2022 10:31 vopl

Re[3]: Специализация метода. Нужно устранить ошибку
Здравствуйте, σ, Вы писали:

V>>Напрямую — никак. Это будет частичная специализация, язык такое не позволяет.


σ>Как можно понять, что template<typename T> void STest4<T>::foo<TypeH2>() это частичная специализация?


Ну, понять это достаточно просто: если после подстановки аргументов шаблон воплощается в тип/значение — то это полная специализация, а если все еще остается шаблоном — то это частичная. В приведенном куске метод foo принадлежит наблону STest4<T>, то есть сам продолжает быть шаблоном, занчт — частичная специализация. Еще примеры:

template <class T>
struct STest4
{
    template <class X> void foo();
};

// полная
template <> template <> void STest4<int>::foo<int>() {}

// полная
template <> template <> void STest4<int>::foo<char>(){}

// частичная
// template <> template <class X> void STest4<int>::foo<X*>(){}

// частичная
// template <class T> template <> void STest4<T>::foo<int>(){}


Тут более формально описано https://en.cppreference.com/w/cpp/language/partial_specialization. Xастичная специализация разрешена только для классовых типов и переменных:

Partial template specialization
Allows customizing class and variable (since C++14) templates for a given category of template arguments.

Re[3]: Специализация метода. Нужно устранить ошибку
Здравствуйте, σ, Вы писали:

V>>Напрямую — никак. Это будет частичная специализация, язык такое не позволяет.


σ>Как можно понять, что template<typename T> void STest4<T>::foo<TypeH2>() это частичная специализация?


Ну, понять это достаточно просто: если после подстановки аргументов шаблон воплощается в тип/значение — то это полная специализация, а если все еще остается шаблоном — то это частичная. В приведенном куске метод foo принадлежит наблону STest4<T>, то есть сам продолжает быть шаблоном, занчт — частичная специализация. Еще примеры:

template <class T>
struct STest4
{
    template <class X> void foo();
};

// полная
template <> template <> void STest4<int>::foo<int>() {}

// полная
template <> template <> void STest4<int>::foo<char>(){}

// частичная
// template <> template <class X> void STest4<int>::foo<X*>(){}

// частичная
// template <class T> template <> void STest4<T>::foo<int>(){}


Тут более формально описано https://en.cppreference.com/w/cpp/language/partial_specialization. Частичная специализация разрешена только для классовых типов и переменных:

Partial template specialization
Allows customizing class and variable (since C++14) templates for a given category of template arguments.