Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 20.02.2016
Сообщений: 21

Шаблонный класс list

26.04.2016, 18:39. Показов 4135. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, пишу шаблонный list, но вот на определённом этапе возникла ошибка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#ifndef LIST_H
#define LIST_H
 
#include<iostream>
 
template<typename T>
class List
{
    class Cell
    {
        Cell* next;
        T value;
    public:
        Cell();
        Cell(T);
        Cell* getNext();
    };
    Cell* head;
    Cell* last;
    int count;
public:
    List();
    void push_back(T);
    int size();
};
 
template<typename T>
List<T>::Cell::Cell()
    :next(nullptr), value(0) {std::cout<<"Cell"<<std::endl;}
 
template<typename T>
List<T>::Cell::Cell(T val)
{
    next=new Cell;
    Cell::next->value=val;
}
 
template<typename T>
List<T>::Cell* List<T>::Cell::getNext() // need 'typename' before 'List<T>::Cell' because 'List<T>' is a dependent scope
{
    return next;
}
 
template<typename T>
List<T>::List()
    :head(nullptr), last(nullptr), count(0) {}
 
//template<typename T>
//void List<T>::push_back(T val)
//{
//    last->next=new Cell(val);
//    count++;
//}
 
template<typename T>
int List<T>::size()
{
    return count;
}
 
#endif // LIST_H
По идее имя возвращаемого типа это указатель на Cell, но надо явно указать, что Cell из List<T>, поэтому получается List<T>::Cell*, но возникает ошибка, если убрать List<T>, то логично, что возникает ошибка "Cell does not name of type". Почему она возникает и как её исправить?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.04.2016, 18:39
Ответы с готовыми решениями:

Шаблонный класс List
Имеется 2 шаблонных класса List и Node. Один объявлен другом другого. По идее должно работать, но у компилятора другое мнение на этот счет:...

Шаблонный класс list, собственная реализация
Привет всем. Я по чуть-чуть пишу шаблонный класс list с добавлением элементов в начало списка. Уже на свой страх и риск реализовал три...

Создать динамический шаблонный класс односвязный список - List
помогите пожалуйста с задание в универ задали и я вот сижу парюсь! буду очень вам благодарен Создать динамический шаблонный класс...

3
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.04.2016, 19:00
Лучший ответ Сообщение было отмечено sm4ll_3gg как решение

Решение

Цитата Сообщение от sm4ll_3gg Посмотреть сообщение
template<typename T>
List<T>::Cell* List<T>::Cell::getNext() // need 'typename' before 'List<T>::Cell' because 'List<T>' is a dependent scope
{
* * return next;
}
компилятор вам даже пример текста привел,
каким должен быть синтаксис.

неужели так трудно было догадаться?

C++
1
2
3
4
5
template<typename T>
typename List<T>::Cell* List<T>::Cell::getNext()
{
    return next;
}
1
0 / 0 / 0
Регистрация: 20.02.2016
Сообщений: 21
26.04.2016, 19:12  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
компилятор вам даже пример текста привел,
каким должен быть синтаксис.

неужели так трудно было догадаться?

C++
1
2
3
4
5
template<typename T>
typename List<T>::Cell* List<T>::Cell::getNext()
{
    return next;
}
Понял, спасибо) думал это часть багрепорта, что отсутствует имя типа)

Добавлено через 7 минут
Цитата Сообщение от hoggy Посмотреть сообщение
компилятор вам даже пример текста привел,
каким должен быть синтаксис.

неужели так трудно было догадаться?

C++
1
2
3
4
5
template<typename T>
typename List<T>::Cell* List<T>::Cell::getNext()
{
    return next;
}
Можно тогда ещё вопрос?
Вот в этом куске кода:
C++
1
2
3
4
5
6
//template<typename T>
void List<T>::push_back(T val)
{
    last->getNext()=new Cell(val);
    count++;
}
компилятор говорит "lvalue required as left operand of assignment"
Вроде как этим я обращаюсь к last.next и пытаюсь выделить под него память на Cell
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.04.2016, 22:11
Цитата Сообщение от sm4ll_3gg Посмотреть сообщение
Можно тогда ещё вопрос?
Вот в этом куске кода:
у вас в коде проблемы посерьезнее.
я поправил что смог.

http://rextester.com/HURO98603
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#ifndef LIST_H
#define LIST_H
 
#include<iostream>
#include<cassert>
 
struct test_memory_leak
{
    test_memory_leak() { ++count(); }
   ~test_memory_leak() { --count(); }
    
    static size_t& count() 
        { static size_t c=0; return c; }
    static void check() 
        { assert( count()==0 && "memory leak" ); }
};
 
 
template<typename T> class List
{
    struct Cell
    {
        Cell* next;
        T value;
    
        Cell(const T&);
    private:
        Cell(const Cell&)            = delete;
        Cell& operator=(const Cell&) = delete;
    };
    
    Cell*  head;
    Cell*  last;
    size_t count;
public:
    List();
   ~List();
    
    template<class U>
        void push_back(U&&);
        
    size_t size()const;
};
 
template<typename T>
    List<T>::~List()
    {
        auto* cur = this->head;
        while(cur)
        {
            auto* next = cur->next;
            delete cur;
            cur = next;
        }
    }
 
template<typename T>
    List<T>::Cell::Cell(const T& val)
        : next()
        , value(val)
    {}
 
 
template<typename T> List<T>::List()
    : head(nullptr)
    , last(nullptr)
    , count() 
{}
 
template<typename T>
    template<typename U>
    void List<T>::push_back(U&& val)
    {
        if(!head)
            head = new Cell( std::forward<U>(val) ),
            last = head;
        else
            last->next = new Cell( std::forward<U>(val) ),
            last = last->next;
        ++count;
    }
 
template<typename T>
size_t List<T>::size()const
    { return count; }
 
#endif // LIST_H
 
int main()
{
    std::cout << "Hello, world!\n";
    
    {
        List<int> mylist;
        for(size_t n=0; n<10; ++n)
            mylist.push_back(n);
    }
    {
        List<test_memory_leak> mylist;
        for(size_t n=0; n<10; ++n)
            mylist.push_back(test_memory_leak());
        test_memory_leak::check();
    }
    
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.04.2016, 22:11
Помогаю со студенческими работами здесь

Написать шаблонный класс List для работы с одноправленными списками в динамической памяти
Для объектов класса List определить операции проверки списка на пустоту, добавления элемента в начало списка, в конец списка, подсчет...

Класс Matrix: реализовать шаблонный класс для двумерных массивов
Доброго времени суток. У меня вопрос: я создал класс Array со внутренним динамическим массивом и объекты этого типа смог создать и я ими...

Шаблонный класс и класс одномерный массив
Задание: протестировать класс шаблон, с обычными типами данных я понял как делать, а как передать в шаблон свой класс я не понял. ...

Переделать класс в шаблонный класс
Как данный процесс проделать? Я попробовал так по синтаксису из учебника: #include &lt;iostream&gt; #include &lt;fstream&gt; ...

Шаблонный класс
Ребят, прошу Вашей помощи.. Программу я написала.. Она работает. Но теперь мне нужно переделать ее , используя шаблонный класс. Я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru