#c #linked-list
#c #связанный список
Вопрос:
Я не знаю, почему я получаю эту ошибку: list.cpp:127: ошибка: ‘class List’ не имеет члена с именем ‘curr’
template <class T>
List<T> List<T>::mixSplit()
{
List<T> * newList;
class List<T>::ListNode * curr = head;
newList->length=0;
newList->length-3;
newList->head = NULL;
newList->tail=NULL;
for (int count=0;count<1;count )
newList->curr=newList->curr->next;
newList->head=newList->curr;
newList->tail=tail;
tail=newList->curr->prev;
tail->next=NULL;
newList->head->prev=NULL;
newList->tail->next=NULL;
return newList;
}
Ошибка возникает при
newList->curr=newList->curr->next;
Когда я делаю это:
class List<T>::ListNode * curr = head;
Разве это не должно позволять curr
быть главой newList
?
Редактировать: вот определение класса:
template <class T>
class List
{
private:
class ListNode
{
public:
// constructors; implemented in list_given.cpp
ListNode();
ListNode(T const amp; ndata);
// member variables
ListNode * next;
ListNode * prev;
const T data; // const because we do not want to modify node's data
};
Комментарии:
1. Как насчет публикации определения списка классов?
2. Вам необходимо опубликовать ошибку. Из приведенного кода все выглядит нормально.
Ответ №1:
У класса List
нет члена curr
, вот что говорится в ошибке. Я почти уверен, что у класса действительно нет этого члена.
Тот факт, что в другой области видимости есть другая переменная с тем же именем, не имеет значения.
Ответ №2:
Использовать typename
как вместо class
:
typename List<T>::ListNode * curr = head; //correct
//class List<T>::ListNode * curr = head; //incorrect
Это один из примеров, когда вы не можете использовать class
вместо typename
.
ошибка: list.cpp:127: ошибка: ‘class List’ не имеет члена с именем ‘curr’
Из ошибки ясно, что определение шаблона находится в .cpp
файле. Это еще одна причина проблемы. Вы не можете предоставить определение шаблона в другом файле. Объявление и определение должны быть в одном файле. Поэтому переместите все определение в файл заголовка.
Комментарии:
1. Я не уверен, что это проблема ранее в коде, я смог использовать указатель curr, но по какой-то причине здесь, когда я пытаюсь создать список, не получает член curr. Я просто хочу назначить указатель на начало нового списка.
2. Вы правы, что это один из примеров, который
class
невозможно заменитьtypename
. Однако для пользовательских классов class может заменить typename . Кроме того, еслиtypename
бы была проблема, строка ошибки была бы другой.3. @user949358: Почему вы не публикуете код
List<T>
? А также сообщите нам заголовки и исходный файл.4. @Nawaz Добавил определение класса Я просто не понимаю, как я могу назначить указатель на заголовок нового списка
5. @user949358: я не вижу ни одного элемента
curr
в определении. Почему вы не видите, что вы опубликовали, и к каким участникам вы пытаетесь получить доступ?
Ответ №3:
Проблема в том, что внутри нет такого элемента, как curr
внутри List<T>
! Вы неправильно поняли это, curr
является членом List<T>::ListNode
!!.
Простое объявление class
внутри class
не означает, что все члены внутреннего класса также делегированы внешнему классу и наоборот. ListNode* curr;
List<T>
Для этого вам нужно иметь inside.
После устранения ошибок компилятора вы в конечном итоге решите ошибки времени выполнения, потому что с вашим классом есть несколько других проблем. Например,
List<T> * newList; // dangling/uninitialized pointer
class List<T>::ListNode * curr = head; // curr is unused and pointing to something unknown
newList = new List<T>;
Для использования указателя необходимо выполнить инициализацию. Или вы можете объявить автоматический объект как List<T> newList;
.