Я создаю класс связанного списка, который использует внутренний класс Link
и класс шаблона для определения типов, которые могут быть сохранены в связанном списке.Инициализация переменной шаблона для связанного списка
Однако в моем методе popValue
, который должен возвращать шаблон типа T
, я не могу инициализировать тип по умолчанию (в данном случае, под названием Point
), несмотря на то, что тип хранится в каждом звене имеет конструктор по умолчанию - который в соответствии с these questions, указывает, что T retval = T()/T{}
должен работать.
Кроме того, я не вижу, как соответствует сообщение об ошибке, учитывая, что T retval
не является ссылочным типом?
Следовательно, рассматриваемый метод:
template<typename T>
T LinkedList<T>::popValue() {
T retval = T(); //This doesnt work
Point test = Point(); //But this is allowed?
if (head != 0) {
Link *n = head;
retval = head->value;
head = head->next;
delete n;
}
return retval;
}
дает следующую ошибку value-initialization of reference type 'Point&'
:
Как я могу инициализировать эту переменную шаблона значение по умолчанию, так что если есть нет элементов в LinkedList, это значение по умолчанию можно вернуть, учитывая, что методы, описанные в других вопросах, похоже, не работают?
Большое спасибо,
Дэвид
EDIT
Из комментариев, я смотрел на специализации LinkedList.h
и обнаружил, что я сделал большую ошибку, чтобы использовать его в качестве LinkedList<Point&> list;
. При использовании в форме шаблона это означает, что T
пытается создать экземпляр ссылочного типа - что недопустимо.
Для справки, я включил краткий код список того, что я думал, буду соответствующий код (но удалил недостоверные включают в себя, охрану и пространства имен для краткости) ...:
LinkedList.h
template<typename T>
class LinkedList {
public:
struct Link { ///< Struct inside the class LinkedList
Link(T val): value(val), next(0){};
T value;
Link *next;
~Link() {
delete next;
} //Iteratively delete
};
T popValue(); ///< returns first element and deletes Link.
private:
Link *head; // this is the private member variable. It is just a pointer to the first Node
};
#include "LinkedList.cpp" //Allows definition of template methods in .cpp file
LinkedList.cpp (ошибочный метод только)
template<typename T>
T LinkedList<T>::popValue() {
T retval = T(); //This doesnt work
Point test = Point(); // But this does
if (head != 0) {
Link *n = head;
retval = head->value;
head = head->next;
delete n;
}
return retval;
}
Но тогда я мог бы использовать его для типа, который не является объектом «Point»? – davidhood2
Не могли бы вы дать очень короткий ответ, чтобы показать, как это будет использоваться для LinkedList.h/.cpp (просто просто описание класса и конструктор или один метод будет в порядке)? – davidhood2
Компилятор «LinkedList» инициализируется с помощью 'T = Point &'. Это явно не то, что вы хотите. Пожалуйста, опубликуйте [mcve]. –