ошибка: ‘Список классов ’ не имеет члена с именем ‘curr’ Связанный список

#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; .