Определение функций не-членов в шаблонном классе

Столкнулся с невероятно глупой ошибкой, которая не дает пройти дальше. У меня есть шаблонный класс со вложенным классом. Все это в сумме — двусвязный список на основе адресных указателей. List.h

template <class T>
class List {
public:
    List();
    List(const List& list); 
    ~List();    

private:
    int size;
    Node* head; 
    Node* tail; 

    class Node {    
        friend class List;
    private:
        T data;     
    public:
        Node* next; 
        Node* prev;
        Node() {    
            next = nullptr;
            prev = nullptr;
        }
        ~Node() {}
    };
public:

    int  add(T a, int index);

};

В этом же файле определение функции добавления нового элемента по индексу в список:

template <typename T>
int List<T>::add(T a, int index) {
    int jump = 0;
    if (index == size) {
        add(a);
        return jump;
    }
    else if (index < size && index >= 0) {
        Node* ptr;
        Node* temp = new Node;
       
        rationalPtr(ptr, index, jump, size);
     
        if (ptr == head) {
            temp->next = head;
            temp->next->prev = temp;
            temp->prev = nullptr;
            head = temp;
        }
        else if (ptr == tail) {
            temp->prev = tail->prev;
            temp->next = tail;
            temp->prev->next = temp;
            tail->prev = temp;

        }
        else {
            temp->next = ptr;
            temp->prev = ptr->prev;
            temp->next->prev = temp;
            temp->prev->next = temp;
        }
        temp->data = a;
        size++;
        return jump;
    }
    else
        return 0;
}

Проблема заключается в том, что в этой и во многих других неуказанных функциях я использую алгоритм, которые решает, рациональнее делать проход по структуре с головы или же с хвоста двунаправленного списка. Так как это код используется часто, я захотел его сделать отдельной функцией, которая принимает указатель на ссылку и некоторые остальные параметры по ссылке, чтобы метод сразу же изменял их по ходу своей работы, в том числе она имеет доступ к членам класса. ВОПРОС: Как определить функцию rationalPtr(Node*& ptr, int& index, int& jump, int size) вне шаблонного класса, чтобы элементы списка никак не имели к ней доступ, потому что она с ними не должна работать.

Тело функции rationalPtr()

void rationalPtr(Node*& ptr, int& index, int& jump, int size) {
    if (index > size / 2 - 1) {
        ptr = tail;
        while (index != size - 1) {
            ptr = ptr->prev;
            index++;
            jump++;
        }
    }
    else {
        ptr = head;
        while (index != 0) {
            ptr = ptr->next;
            index--;
            jump++;
        }
    }
}

Ответы (0 шт):