0

I want to realize a singly linked list with C++ and Templates. Therefore I already wrote a Header file (list.h):

list.h

#ifndef LINKEDLIST_LIST_H
#define LINKEDLIST_LIST_H

#include <iostream>
#include <string>
#include <tuple>
#include <functional>

template<typename K, typename V>
class list;

template<typename K, typename V>
list<K, V> &operator+=(list<K, V> &, const std::tuple<K, V>);

template<typename K, typename V>
list<K, V> &operator-=(list<K, V> &, const K);

template<typename K, typename V>
std::ostream &operator<<(std::ostream &, const list<K, V> &);

template<typename K, typename V>
class list {
private:
struct element {
    const K key;
    const V value;
    element *next;

    element(const std::tuple<K, V>, element *);
};

element *head = nullptr;
public:
    ~list();

    const V *search(const K) const;

    bool isEmpty() const;

    bool isSorted(std::function<bool(K, K)> lessThan) const;

    std::tuple<K, V> popHead();

    void sort(std::function<bool(K, K)> lessThan);

    friend list<K, V> &operator+=<>(list<K, V> &, const std::tuple<K, V>);

    friend list<K, V> &operator-=<>(list<K, V> &, const K);

    friend std::ostream &operator<<<>(std::ostream &, const list<K, V> &);
};

#endif //LINKEDLIST_LIST_H

One should be able to add elements to the list via a += operator overloading. But when I try to implement the method I get a "expected type-specifier" error from my compiler. This happens when trying to compile:

element *newElement = new element(tuple, current);

list.cpp (+= Operator Overloading)

template<typename K, typename V>
list<K, V> &operator+=(list<K, V> &list, const std::tuple<K, V> tuple) {
    // Iterate over the list to check if the key already exists.
    auto current = list.head;
    while (current != nullptr) {
        if (current->value == std::get<0>(tuple)) {
            V *oldValue = current->value;
            current->value = std::get<1>(tuple);
            delete oldValue; // Cleanup old value.
            return list;
        }
    }

    // Current is now the last element.
    element *newElement = new element(tuple, current);

    // Update head in case it is not set already.
    if (head == nullptr) {
        head = newElement;
    }
};

How can I (is this even possible) created generic instances of element inside a generic function?

BullshitPingu
  • 79
  • 2
  • 6

0 Answers0