Проблема с частичной специализацией шаблона класса
Я пытался реализовать функцию, которая нуждается в частичной специализации шаблона и вернулась к методике статической структуры, и у меня возник ряд проблем.
template<typename T> struct PushImpl<const T&> {
typedef T* result_type;
typedef const T& argument_type;
template<int StackSize> static result_type Push(IStack<StackSize>* sptr, argument_type ref) {
// Code if the template is T&
}
};
template<typename T> struct PushImpl<const T*> {
typedef T* result_type;
typedef const T* argument_type;
template<int StackSize> static result_type Push(IStack<StackSize>* sptr, argument_type ptr) {
return PushImpl<const T&>::Push(sptr, *ptr);
}
};
template<typename T> struct PushImpl {
typedef T* result_type;
typedef const T& argument_type;
template<int StackSize> static result_type Push(IStack<StackSize>* sptr, argument_type ref) {
// Code if the template is neither T* nor T&
}
};
template<typename T> typename PushImpl<T>::result_type Push(typename PushImpl<T>::argument_type ref) {
return PushImpl<T>::Push(this, ref);
}
Во-первых: структура вложена в другой класс (тот, который предлагает Push в качестве члена-функции), но она не может получить доступ к параметру шаблона (StackSize), даже если все остальные мои вложенные классы могут. Я работал над этим, но было бы чище, если бы они могли просто получить доступ к StackSize, как обычный класс.
Второе: компилятор жалуется, что не использует или не может вывести T. Правда?
В-третьих: компилятор жалуется, что не может специализировать шаблон в текущей области видимости (области видимости класса).
Я не вижу, в чем проблема. Я случайно вызвал какой-то плохой синтаксис?
1 ответ
Общий случай должен предстать перед специализациями, иначе специализациям нечего специализировать.