IMO, правила шаблона C ++ кажутся слишком строгими, и реализация компилятора определена.Но здесь у меня есть определенное поведение, с которым мне трудно было обернуться.
В следующей задаче я сознательно стараюсь избегать явной специализации родительского класса.
Проблема в том, что я могу частично специализировать участника, но не могу специализировать его полностью.Что действительно противоречит интуиции, потому что вы можете легко добавить фиктивный шаблон в полностью специализированный шаблон и сделать его частично специализированным.Что здесь происходит ??
Важное редактирование: это важно, потому что, как мы знаем, вы не можете специализировать функции-члены, не специализируя также и класс (что можно рассматривать как комбинацию этой проблемы, необходимобыть частично специализированным, и тот факт, что c ++ не допускает частично специализированные функции. Я не знаю, связаны ли они, но, по крайней мере, они согласованы), поэтому, если вы хотите, чтобы в вашем классе был функционал, вы можете специализировать себя »Застрял с использованием функторов.И вдобавок к этому вам нужно добавить фиктивный параметр шаблона, просто чтобы заставить это работать !!
Это работает:
template <class T>
class A
{
template<typename Y, typename Z>
struct C{
void operator()(int x);
};
template<typename Z>
struct C<int, Z>{
void operator()(int x);
};
};
template <class T>
template <typename Z>
void A<T>::C<int, Z>::operator()(int x){
}
Но это не так:
template <class T>
class A
{
template<typename Y>
struct C{
void operator()(int x);
};
template<>
struct C<int>{
void operator()(int x);
};
};
template <class T>
template <>
void A<T>::C<int>::operator()(int x){
}
Редактировать: Шон Ф. в комментариях указал, что компилятору сложно выбрать специализацию.Но проблема здесь в том, что частичная специализация не устраняет эту проблему.Так что это не может быть ответом.