В настоящее время я пытаюсь реализовать простой связанный список на основе шаблона, который принимает общую пару ключ/значение в С++ 11. Элементы должны быть добавлены в список оператором +=. Код выглядит следующим образом:
список
// Forward declarations
template<typename K, typename V>
class list;
template<typename K, typename V>
list<K, V> &operator+=(list<K, V> &list, const std::tuple<K, V> ele) {
if (!list.head) {
// list is empty
list.head = new element(ele, nullptr);
}
return list;
};
// Class definition
template<typename K, typename V>
class list {
private:
struct element {
const K key;
const V value;
element *next;
element(const std::tuple<K, V> tuple, element *ele) :
key(std::get<0>(tuple)),
value(std::get<1>(tuple)),
next(ele) { }
};
element *head = nullptr;
public:
friend list<K, V> &operator+=<>(list<K, V> &list, const std::tuple<K, V> ele);
};
Я не могу заставить это скомпилировать. Должен ли я помещать реализацию оператора в предварительное объявление или в сам класс? Если я поместил это в предварительную декларацию, как во фрагменте, я не могу использовать «list.head = новый элемент (ele, nullptr);». Ошибка: ожидаемый спецификатор типа перед элементом
Если я помещу его в сам класс, я не смогу получить доступ к list.head, даже если это друг.
operator+=
, указанный в объявлении друга, является шаблоном. 15.11.2017