0 / 0 / 0
Регистрация: 06.06.2022
Сообщений: 7
1

Список переменных через шаблон

06.06.2022, 23:16. Показов 1229. Ответов 10

Author24 — интернет-сервис помощи студентам
Здравствуйте. Пытаюсь сделать связной список с шаблоном. То есть связной список, который будет хранить в себе переменные любого типа (кроме таких типов как std::deque, std::list, std::vector, std:air, std::tuple и тому подобные).

Однако, в процессе написания кода, возникла ошибка: "Field has incomplete type 'void'" (строка 14).
Не знаю как пофиксить эту ошибку.
Список переменных через шаблон


Вот сам код:

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
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
 
 
class list {
private:
    size_t lenght = 0;
    size_t tempPosition = 0;
    
protected:
    template <typename type> struct Node {
        struct Node<void> * prev = nullptr;
        type var;   // Any variable carrier (except for other STL lists)
        struct Node<void> * next = nullptr;
    };
    
    Node<void> * head = nullptr;
    Node<void> * tail = nullptr;
    Node<void> * temp = nullptr;
    
public:
    template <typename type> inline void insert(type var) { //Inserting element
        if (this->head == nullptr) { // check if list is empty
            this->head = new Node<void>(); // If so, allocate the head
            this->head->var = var; // Fill the head
            this->temp = this->head; //Define pointers
            this->tail = this->head;
        } else {
            this->tail->next = new Node<void>(); //If no, allocate the next
            this->tail->next->var = var; // Fill the next
            this->tail->next->prev = this->tail; //Make prev of next to current
            this->tail = this->tail->next; //Move tail to next
        }
        this->lenght++; // Increase size of list var
        return;
    }
    
    inline void print_list(void) {
        Node<void> * ptr = this->head; // Make iteratable pointer
        while (ptr != this->tail) { // Iterated untill end
            std::cout << ptr->var; // Print value
            ptr = ptr->next;
        }
    }
    
    inline bool empty(void) { // Return bool if list is empty
        if (this->head == nullptr)
            return true;
        return false;
    }
    
    inline size_t size(void) { // Return size of list
        return this->lenght;
    }
};
 
int main(void) {
    list array;
    array.insert(5);
    array.insert("World");
    array.insert('?');
    array.print_list();
    return EXIT_SUCCESS;
}
Буду благодарен за помощь. Также если есть какое-то недопонимание в моем вопросе - напишите, постараюсь перефразировать свою проблему.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2022, 23:16
Ответы с готовыми решениями:

Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон
Есть у меня 3 структуры Трамвай , Троллейбус , Автобус. Для автобуса определены функции (работают)...

"LinkedList": для использования класс шаблон требуется список аргументов шаблон
Что то не могу въехать в чем промах? LinkedList.h #pragma once #include &lt;iostream&gt; #include...

Ошибка при компиляции:"C2955 "Tree": для использования класс шаблон требуется список аргументов шаблон"
Есть класс бинарного дерева, в нем структура. Класс - Tree, структура - list(листик, а не список)....

Выделить из слова наименование переменных и вставить в шаблон
У нас есть слово - ab1cd23e У нас есть шаблон математического выражения - x1()=x2()+x3() Нужно...

Разработать шаблон класса “множество” (реализация через список)
Разработать шаблон класса “множество” (реализация через список). Тип элементов множества за-...

10
фрилансер
5802 / 5316 / 1093
Регистрация: 11.10.2019
Сообщений: 14,196
07.06.2022, 08:57 2
Цитата Сообщение от RCyberCPP Посмотреть сообщение
type var;
Цитата Сообщение от RCyberCPP Посмотреть сообщение
Node<void>
нельзя определить поле типа void

Цитата Сообщение от RCyberCPP Посмотреть сообщение
Пытаюсь сделать связной список с шаблоном
а так подойдёт?
C++
1
std::list<std::variant<тут_перечислить_типы>> array;
0
0 / 0 / 0
Регистрация: 06.06.2022
Сообщений: 7
07.06.2022, 12:29  [ТС] 3
Я попробовал твой предложеннный вариант, ииии.... такая вот ошибка
Список переменных через шаблон
0
2851 / 1999 / 987
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
07.06.2022, 13:10 4
Цитата Сообщение от RCyberCPP Посмотреть сообщение
такая вот ошибка
надо перебирать что внутри
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
#include <vector>
#include <variant>
 
 
int main() 
{
    std::vector<std::variant<int, char, std::string>> vct{'g', 56, "gh"};
    for (auto const& var : vct)
    {
        if(std::holds_alternative<int>(var))
            std::cout << std::get<int>(var) << " ";
        else if (std::holds_alternative<char>(var))
            std::cout << std::get<char>(var) << " ";
        else
            std::cout << std::get<std::string>(var) << " ";
    }
}
0
0 / 0 / 0
Регистрация: 06.06.2022
Сообщений: 7
07.06.2022, 13:30  [ТС] 5
Именно по этому я хочу использовать шаблон, чтобы ничего не проверять. Что если тип числа: long long int или long int или double или float?
Тогда у меня код будет выглядеть как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
if(std::holds_alternative<int>(var))
    std::cout << std::get<int>(var) << " ";
else if (std::holds_alternative<char>(var))
    std::cout << std::get<char>(var) << " ";
else if (std::holds_alternative<std::string>(var))
    std::cout << std::get<std::string>(var) << " ";
else if (std::holds_alternative<long int>(var))
    std::cout << std::get<long int>(var) << " ";
else if (std::holds_alternative<long long int>(var))
    std::cout << std::get<long long int>(var) << " ";
и так далее
Какое-то грубое использование else if, хотя бы switch никак не использовать
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
07.06.2022, 13:58 6
Цитата Сообщение от RCyberCPP Посмотреть сообщение
Именно по этому я хочу использовать шаблон, чтобы ничего не проверять. Что если тип числа: long long int или long int или double или float?
C++
1
2
for(auto const& var : std::list<std::variant<char, int, std::string>>{'1', 'a', "hello world", 3991})
  std::visit([](auto const& val){ std::cout << val << " | "; }, var);
2
0 / 0 / 0
Регистрация: 06.06.2022
Сообщений: 7
07.06.2022, 14:20  [ТС] 7
Цитата Сообщение от zayats80888 Посмотреть сообщение
for(auto const& var : std::list<std::variant<char, int, std::string>>{'1', 'a', "hello world", 3991})
  std::visit([](auto const& val){ std::cout << val << " | "; }, var);
А есть такая возможность - не использовать std::variant? Используя его, я по-сути вынужден вписать туда все типы в c++, чтобы он работал на всю катушку. Кто знает - сколько таких типов в с++ существует.
Есть ли что-то, что работало как: std::list<std::variant<decltype(var)>> ?
Какой-нибудь keyword, который включает в себя все типы, которые существуют в С++?

Иначе это будет выглядеть как-то так:

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
int main(void) {
    std::deque<std::variant<
    int,
    short int,
    unsigned int,
    unsigned short int,
    long int,
    long long int,
    unsigned long int,
    unsigned long long int,
    const long int,
    const long long int,
    size_t,
    ssize_t,
    double,
    float,
    const double,
    const float,
    std::string,
    char,
    int *,
    char *,
    const int,
    const double,
    const float,
    const char,
    const unsigned int,
    const unsigned long int,
    const unsigned long long int,
    const unsigned short int,
    user_size_t,
    const std::string,
    const size_t,
    const ssize_t,
    const user_size_t,
    int64_t,
    int32_t,
    int8_t,
    int16_t,
    intmax_t,
    intptr_t,
    const int64_t,
    const int32_t,
    const int8_t,
    const int16_t,
    const intmax_t,
    const intptr_t,
    const char *,
    const int *,
    double *,
    float *,
    const double *,
    const float *,
    std::fstream,
    std::ofstream,
    std::streambuf,
    std::streampos,
    std::streamoff>> d;
     
    return EXIT_SUCCESS;
}
И это не все типы, которые существуют
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
07.06.2022, 14:46 8
RCyberCPP, c++ - статически типизированный язык, не нужно на него натягивать идиомы динамически типизированных языков. Или поменяйте язык.
1
фрилансер
5802 / 5316 / 1093
Регистрация: 11.10.2019
Сообщений: 14,196
07.06.2022, 14:47 9
Цитата Сообщение от RCyberCPP Посмотреть сообщение
А есть такая возможность - не использовать std::variant?
конечно же есть такая возможность. Всего то лишь - написать свою версию std::variant
0
0 / 0 / 0
Регистрация: 06.06.2022
Сообщений: 7
07.06.2022, 16:30  [ТС] 10
Ну это упрощает все в несколько раз, но вот...

...
Цитата Сообщение от zayats80888 Посмотреть сообщение
std::visit([](auto const& val){ std::cout << val << " | "; }, var);
Я не очень разбираюсь в лямбда функциях, но что тут происходит?
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
07.06.2022, 17:01 11
Цитата Сообщение от RCyberCPP Посмотреть сообщение
Я не очень разбираюсь в лямбда функциях, но что тут происходит?
Аналог(почти):
C++
1
2
3
4
5
6
7
8
struct lambda {
  template<class T>
  auto operator()(T const& val) { std::cout << val << " | "; }
};
 
//...
 
std::visit(lambda{}, var);
Что именно там происходит - детали реализации, но упрощенно можно сказать, что на этапе компиляции, для такого вызова visit создается таблица указателей на инстанцированные каждым типом варианта экземпляры шаблона функции, а в рантайме по идентификатору(индексу) хранящегося в варианте типа из этой таблицы выбирается и вызывается соответсвующий обработчик.

Или еще проще: тот самый switch, которого вы хотели избежать, генерируется автоматически посредством "шаблонной магии"
1
07.06.2022, 17:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2022, 17:01
Помогаю со студенческими работами здесь

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

Подстановка переменных в шаблон
Здравствуйте, уважаемые форумчане! Можете подсказать, как реализовать подстановку значений,...

[Smarty] Передача переменных в шаблон
ребят пытаюсь передать переменные php в шаблон smarty прописываю в php &lt;?php ...

Шаблон Handlebars – Использование переменных для подключения страниц
Имеется простой шаблон сайта, у которого на всех страницах одинаковые header и footer. А значит...

Создать шаблон класса, который находит максимальное значение из 3 переменных
Помогите создать шаблон класса, который находит максимальное значение из 3 переменных. Не смог...

Функции посчитывающие количество вхождений подстроки в строку, реализация через char* и через шаблон
Необходимо реализовать две функции: 1) int SubStrCount(const char *str, const char *subStr);...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru