Ошибки линковки

Я пишу односвязный список и у меня есть несколько пар функций(рекурсивные и процедурные). Хочу включать разные типы функций отдельно. При включении блока с процедурными функциями - все работает хорошо. А вот с рекурсивными - ошибки линковки

#pragma once
#include <iostream>

//#define Normal_func
#define Recurs_func

template<typename type>
class LinkedList
{
private:
    template<typename type>
    class Node
    {
    public:
        Node* pNext;
        type data;

        Node(type elem = type(), Node* pNext = nullptr)
        {
            this->data = elem;
            this->pNext = pNext;
        }

        ~Node()
        {
        }
    };

    Node<type>* head;
    unsigned int len;

public:
    LinkedList();
    ~LinkedList();



    //Перегрузка оператора вывода 
    template<typename type>
    friend std::ostream& operator<<(std::ostream&, LinkedList<type>&);

    // Удалить первый элемент
    type pop_front();

    // Добавить элемент в начало
    void push_front(const type&);

    // Получить размер списка
    unsigned int size();

    // Очистить массив
    void clear();


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifdef Recurs_func

    type& getElem(int ind, int pos = 0, Node<type>* elem = nullptr);

    type popR(int ind, Node<type>* elem = nullptr, int pos = 0);

    void insertR(const type&, int ind, Node<type>* elem = nullptr, int pos = 0);

    void push_backR(const type& elem, int pos = 0, Node<type>* tmp = nullptr);

    type pop_backR(Node<type>* elem = nullptr, int pos = 0);

    type& operator[](int ind);



#define pop popR
#define insert insertR
#define push_back push_backR
#define pop_back pop_backR

#endif 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifdef Normal_func

    type pop(int ind);

    // Вставить элемент по индексу
    void insert(const type&, int ind);


    // Добавление элемента в конец списка 
    void push_back(const type&);

    // Удаление последнего элемента списка через цикл
    type pop_back();

    // Получение элемета по индексу
    type& operator[](int n);

#define pop         pop
#define insert      insert
#define push_back   push_back
#define pop_back    pop_back

#endif 

};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Описание общих функций для двух наборов
template<typename type>
std::ostream& operator<< (std::ostream& out, LinkedList<type>& d)
{
    for (size_t i = 0; i < d.len; i++)
    {
        out << d[i] << " ";
    }
    return out;
}

template<typename type>
inline type LinkedList<type>::pop_front()
{
    Node<type>* tmp = head;
    type data = tmp->data;
    head = tmp->pNext;
    delete tmp;
    len--;
    return data;
}

template<typename type>
inline void LinkedList<type>::push_front(const type& elem)
{
    head = new Node<type>(elem, head);
    len++;
}

template<typename type>
unsigned int LinkedList<type>::size() { return len; }

template<typename type>
inline void LinkedList<type>::clear()
{
    while (len != 0)
    {
        pop_front();
    }
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////




/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifdef Recurs_func

template<typename type>
inline type& LinkedList<type>::getElem(int ind, int pos, Node<type>* elem)
{
    if (ind == 0)
    {
        elem = head;
        return elem->data;
    }
    else if (ind == pos) return elem->data;

    if (elem == nullptr) elem = head;

    if (ind != pos)
    {
        elem = elem->pNext;
        pos++;
        getElem(ind, pos, elem);
    }
    else return elem->data;
}

template<typename type>
type& LinkedList<type>::operator[](int ind){return getElem(ind);}

template<typename type>
inline void LinkedList<type>::push_backR(const type& elem, int pos, Node<type>* tmp)
{
    if (tmp == nullptr) tmp = head;

    if (pos != len)
    {
        tmp = tmp->pNext;
        pos++;
        return push_backR(elem, pos, tmp);
    }
    else
    {
        Node<type>* NewElem = new Node<type>(elem, tmp->pNext);
        tmp->pNext = NewElem;

        len++;
        return;
    }
}

template<typename type>
inline type LinkedList<type>::pop_backR(Node<type>* elem, int pos)
{

    if (pos == 0) elem = head;


    if (pos == len - 1)
    {
        Node<type>* tmp = elem->pNext;
        type data = tmp->data;
        tmp->pNext = nullptr;

        delete tmp;
        len--;
        return data;
    }
    else
    {
        elem = elem->pNext;
        pos++;
        return pop_backR(elem, pos);
    }
}

template<typename type>
inline void LinkedList<type>::insertR(const type& elem, int ind, Node<type>* tmp, int pos)
{

    if (ind == 0) return push_front(elem);
    if (tmp == nullptr) tmp = head;

    if (pos + 1 != ind)
    {
        tmp = tmp->pNext;
        pos++;
        return insertR(elem, ind, tmp, pos);
    }
    else
    {
        Node<type>* NewElem = new Node<type>(elem, tmp->pNext);
        tmp->pNext = NewElem;

        len++;
        return;
    }
}

template<typename type>
inline type LinkedList<type>::popR(int ind, Node<type>* elem, int pos)
{
    if (ind == 0) return pop_front();
    else if (pos == 0) elem = head;


    if (ind == pos - 1 || ind == 1)
    {
        type data = elem->pNext->data;
        Node<type>* tmp = elem->pNext;

        elem->pNext = elem->pNext->pNext;
        len--;
        delete tmp;
        return data;
    }
    else
    {
        elem = elem->pNext;
        pos++;
        return popR(ind, elem, pos);
    }
}


#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifdef Normal_func

template<typename type>
type& LinkedList<type>::operator[](int n)
{
    int number = 0;

    Node<type>* cur = head;
    while (cur != nullptr)
    {
        if (number == n)
        {
            return cur->data;
        }
        cur = cur->pNext;
        number++;
    }
}


template<typename type>
inline void LinkedList<type>::push_back(const type& elem)
{
    if (head == nullptr)
    {
        head = new Node<type>(elem);
    }
    else
    {
        Node<type>* current = this->head;

        while (current->pNext != nullptr)
        {
            current = current->pNext;
        }
        current->pNext = new Node<type>(elem);

    }
    len++;
}


template<typename type>
inline void LinkedList<type>::insert(const type& elem, int ind)
{

    if (ind == 0) push_front(elem);
    else
    {
        Node<type>* tmp = head;

        for (size_t i = 0; i < ind - 1; i++)
        {
            tmp = tmp->pNext;
        }

        Node<type>* NewNode = new Node<type>(elem, tmp->pNext);
        tmp->pNext = NewNode;

        len++;
    }
}


template<typename type>
inline type LinkedList<type>::pop(int ind)
{
    if (ind == 0) return pop_front();

    Node<type>* interator = head;

    for (size_t i = 0; i < ind - 1; i++)
    {
        interator = interator->pNext;
    }

    type data = interator->pNext->data;
    Node<type>* tmp = interator->pNext;

    interator->pNext = interator->pNext->pNext;
    len--;
    delete tmp;
    return data;
}


template<typename type>
LinkedList<type>::LinkedList()
{
    len = 0;
    head = nullptr;
}


template<typename type>
LinkedList<type>::~LinkedList()
{
    clear();
}

#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

введите сюда описание изображения


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