Давайте посмотрим на ваш Node
класс.
struct Node
{
std::string firstName;
std::string lastName;
IType& value;
Node *next;
Node *prev;
};
Класс узла хранит ссылку на IType
.Можно хранить ссылки в структурах и классах, но ссылки имеют , которые должны быть назначены при построении структуры.Давайте посмотрим, как выглядит конструктор для Node
:
struct Node
{
std::string firstName;
std::string lastName;
IType& value;
Node *next;
Node *prev;
Node(std::string const& fName, std::string const& lName, IType& val)
: firstName(fName) //Constructs firstName
, lastName(lName) //Constructs lastName
, value(val) //Assigns the reference
{ } //The body of the constructor doesn't have to do anything
};
В этом случае value
ссылается на вход val
.Для Node
нет конструктора по умолчанию, потому что это оставит значение неназначенным, а ссылку всегда нужно будет присвоить чему-либо.Вот почему компилятор говорит, что он удален.
Определенно есть случаи, когда вы хотите, чтобы класс сохранял ссылку.Я использовал это несколько раз в своем коде, часто при определении классов, которые должны функционировать как замыкание.Это действительно полезно для написания обратных вызовов.Однако в вашем конкретном случае хранение IType
напрямую является, вероятно, лучшим вариантом:
struct Node
{
std::string firstName;
std::string lastName;
//value is stored directly,
//so Node is default-constructible
IType value;
Node *next;
Node *prev;
};