Проблема с частичной специализацией шаблона класса

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

            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 ответ

Решение

Общий случай должен предстать перед специализациями, иначе специализациям нечего специализировать.

Другие вопросы по тегам