Определение функций не-членов в шаблонном классе
Столкнулся с невероятно глупой ошибкой, которая не дает пройти дальше. У меня есть шаблонный класс со вложенным классом. Все это в сумме — двусвязный список на основе адресных указателей. 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++;
}
}
}