Я попытался создать общий двусвязный список самостоятельно, но получил много ошибок и не мог понять, почему.Затем я обратился к своей книге «Структуры данных и алгоритмы на С ++» и попытался проследить за их реализацией общего односвязного списка.Я написал код, как он представлен в книге, но все равно получил более 40 ошибок.Мой профессор быстро взглянул на это в перерыве, но он также не смог найти проблему.
Долго гуглил и пытался реализовать подсказки отсюда https://isocpp.org/wiki/faq/templates#class-templates Например, у меня естьпопытался добавить строку:
template class xxx<int>;
в нижней части Snode.cpp и SLinkedList.cpp
Код ниже является точным кодом из книги, за исключением snode.cpp иконструктор и деструктор в Snode.h, как они не предоставлены, и мне пришлось «угадать», как их реализовать.Я пробовал практически любые варианты, о которых я мог подумать, но ничто не решило проблему
// Snode.h
#pragma once
#include <string>
#include <iostream>
using namespace std;
template <typename E>
class Snode
{
public:
Snode();
~Snode();
private:
E elem;
Snode<E>* next;
friend class SLinkedList<E>;
};
Snode.cpp
#include "Snode.h"
template <typename E>
Snode<E>::Snode()
{
}
template <typename E>
Snode<E>::~Snode()
{
}
SLinkedList.h
#pragma once
#include "Snode.h"
template<typename E>
class SLinkedList
{
public:
SLinkedList();
~SLinkedList();
bool empty() const;
const E& front() const;
void addFront(const E& e);
void removeFront();
private:
Snode<E>* head;
};
SLinkedList.cpp
#include "SLinkedList.h"
template <typename E>
SLinkedList<E>::SLinkedList():
head(nullptr){}
template <typename E>
SLinkedList<E>::~SLinkedList()
{
while (!empty()) removeFront();)
}
template <typename E>
bool SLinkedList<E>::empty() const
{
return head == nullptr;
}
template <typename E>
const E& SLinkedList<E>::front() const
{
return head->elem;
}
template <typename E>
void SLinkedList<E>::addFront(const E& e)
{
SNode<E>* v = new SNode<E>;
v->elem = e;
v->next = head;
head = v;
}
template <typename E>
void SLinkedList<E>::removeFront()
{
SNode<E>* old = head;
head = old->next;
delete old;
}
ОШИБКИ:
1>------ Build started: Project: Generic singly linked list, Configuration: Debug Win32 ------
1>SLinkedList.cpp
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\snode.h(16): error C2059: syntax error: '<'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\snode.h(17): note: see reference to class template instantiation 'Snode<E>' being compiled
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\snode.h(16): error C2238: unexpected token(s) preceding ';'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.h(16): error C2989: 'SLinkedList': class template has already been declared as a non-class template
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\snode.h(16): note: see declaration of 'SLinkedList'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.h(4): error C3857: 'SLinkedList': multiple template parameter lists are not allowed
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(5): error C2988: unrecognizable template declaration/definition
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(5): error C2059: syntax error: '<'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(6): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(6): error C2448: 'head': function-style initializer appears to be a function definition
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(9): error C2988: unrecognizable template declaration/definition
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(9): error C2059: syntax error: '<'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(9): error C2523: '::~SLinkedList': destructor tag mismatch
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(10): error C2143: syntax error: missing ';' before '{'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(10): error C2447: '{': missing function header (old-style formal list?)
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(15): error C2988: unrecognizable template declaration/definition
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(15): error C2143: syntax error: missing ';' before '<'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(15): error C2059: syntax error: '<'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(16): error C2143: syntax error: missing ';' before '{'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(16): error C2447: '{': missing function header (old-style formal list?)
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(21): error C2988: unrecognizable template declaration/definition
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(21): error C2143: syntax error: missing ';' before '<'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(21): error C2040: 'SLinkedList': 'const E &' differs in levels of indirection from 'bool'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(21): error C2059: syntax error: '<'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(21): error C2039: 'front': is not a member of '`global namespace''
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(22): error C2143: syntax error: missing ';' before '{'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(22): error C2447: '{': missing function header (old-style formal list?)
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(27): error C2988: unrecognizable template declaration/definition
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(27): error C2143: syntax error: missing ';' before '<'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(27): error C2182: 'SLinkedList': illegal use of type 'void'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(27): error C2371: 'SLinkedList': redefinition; different basic types
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(15): note: see declaration of 'SLinkedList'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(27): error C2059: syntax error: '<'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(27): error C2039: 'addFront': is not a member of '`global namespace''
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(28): error C2143: syntax error: missing ';' before '{'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(28): error C2447: '{': missing function header (old-style formal list?)
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(36): error C2988: unrecognizable template declaration/definition
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(36): error C2143: syntax error: missing ';' before '<'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(36): error C2182: 'SLinkedList': illegal use of type 'void'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(36): error C2371: 'SLinkedList': redefinition; different basic types
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(15): note: see declaration of 'SLinkedList'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(36): error C2059: syntax error: '<'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(36): error C2039: 'removeFront': is not a member of '`global namespace''
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(37): error C2143: syntax error: missing ';' before '{'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.cpp(37): error C2447: '{': missing function header (old-style formal list?)
1>Snode.cpp
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\snode.h(16): error C2059: syntax error: '<'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\snode.h(17): note: see reference to class template instantiation 'Snode<E>' being compiled
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\snode.h(16): error C2238: unexpected token(s) preceding ';'
1>Source.cpp
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\snode.h(16): error C2059: syntax error: '<'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\snode.h(17): note: see reference to class template instantiation 'Snode<E>' being compiled
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\snode.h(16): error C2238: unexpected token(s) preceding ';'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.h(16): error C2989: 'SLinkedList': class template has already been declared as a non-class template
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\snode.h(16): note: see declaration of 'SLinkedList'
1>c:\users\kent\source\repos\generic singly linked list\generic singly linked list\slinkedlist.h(4): error C3857: 'SLinkedList': multiple template parameter lists are not allowed
1>Generating Code...
1>Done building project "Generic singly linked list.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Любая помощь будет принята с благодарностью