Форум программистов, компьютерный форум CyberForum.ru

не работает шаблонная функция - C++

Восстановить пароль Регистрация
 
Flamе
9 / 9 / 0
Регистрация: 25.10.2009
Сообщений: 152
16.08.2010, 14:14     не работает шаблонная функция #1
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
#include <iostream>
#include <stdio.h>
#include <list>
using namespace std;
 
template <class V, class E>
struct graph
{
    struct v_info;
    struct e_info;
 
    struct v_info
    {
        V i;
        list <e_info> *e;
    };
 
    struct e_info
    {
        E i;
        list <v_info> *v;
    };
 
    list <v_info> *v;
};
 
template <class T>
void list_add(list <T> *&l, T x);
 
const int n=6;
int main()
{
//Создаём n вершин графа
    graph <int, int> g; 
    g.v=NULL;
    for (int i=0; i<n; i++)
        list_add (g.v, graph::v_info());
    return 0;
}
 
template <class T>
void list_add(list <T> *&l, T x)
{
    list <T> *n=new list <T>;
    n->next=l;
    n->insert=x;
    l=n;
}
в строке вызова функции list_add выдаются следующие ошибки:
'graph': использование шаблона класса требует списка параметров шаблона
'graph <V, E>:: v_info': у класса нет никаких конструкторов

подскажите пожалуйста как их исправить??
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2010, 14:14     не работает шаблонная функция
Посмотрите здесь:

C++ Шаблонная функция С++
C++ Не работает шаблонная функция с типом char
C++ шаблонная функция С++
Шаблонная функция C++
C++ Шаблонная функция
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
16.08.2010, 17:03     не работает шаблонная функция #2
C++
1
2
3
        for (int i=0; i<n; i++)
                list_add<graph<int,int>::v_info>(g.v, graph<int,int>::v_info() );
        return 0;
...
C++
1
2
3
        list <T> *n=new list <T>;
        n->next=l;
        n->insert=x;
это вам не линейные списки))
Flamе
9 / 9 / 0
Регистрация: 25.10.2009
Сообщений: 152
17.08.2010, 01:04  [ТС]     не работает шаблонная функция #3
спасибо!)) да, мне тоже эта функция не нравится... вот только не понятно, нужно переделать функцию так чтобы вместо T i и list *next было нечто свойственное для графа???)
просто на лекция сначало прошли списки, а когда проходили графы и писали функцию для создания графа, на вопрос как сделать так чтобы функция list_add(у меня просто были подозрения что для этого нужна структура для списка отдельно))) работала препод сказал что она шаблонная и типа всё ок)
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
17.08.2010, 08:21     не работает шаблонная функция #4
я имел в виду, что у STL'вского листа совсем другие методы
например http://cplusplus.com/reference/stl/list/push_back/

вообще list довольно сложно использовать для графа, двумерный массив не подойдет? или подразумевается большое число вершин?
Flamе
9 / 9 / 0
Регистрация: 25.10.2009
Сообщений: 152
18.08.2010, 16:02  [ТС]     не работает шаблонная функция #5
ну просто мы работаем с графом в динамической структуре, представляем его как список вершин, каждая вершина которого в свою очередь содержит список рёбер смежных этой вершине....

Добавлено через 2 часа 47 минут
вся функция выглядит так:
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
int main()
{
    graph <int, int> g; 
    g.v=NULL;
//создаём n вершин графа
    for (int i=0; i<n; i++)
        list_add (g.v, graph <int, int>::v_info());
//в каждой вершине создаём список рёбер
    for (list <graph<int, int>::v_info> *p=g.v; p; p=p->next)
    {
        p->i.e=NULL;
        for (int i=0; i<n; i++)
            list_add(p->i.e, graph<int, int>::e_info());
        list <graph<int, int>::v_info> *r=g.v;
        list <graph<int, int>::e_info> *q=p->i.e;
//устанавливаем стрелки
        while (r)
        {
            q->i.v=r;
            q=q->next;
            r=r->next;
        }
    }
    return 0;
}
вот компилятор ругается типа что не понимает откуда берется p->next, q->i.v.... и я вот тоже не могу понять
вапще если я прально понимаю, то нужна как-то структуру графа то-ли вписать то-ли связать со структурой односвязного линейного списка....
SergProgC++
Эксперт GPSS
 Аватар для SergProgC++
314 / 316 / 59
Регистрация: 02.07.2010
Сообщений: 1,315
18.08.2010, 16:17     не работает шаблонная функция #6
А ты можешь условие полное задачи дать, глядишь я чем помогу?
Flamе
9 / 9 / 0
Регистрация: 25.10.2009
Сообщений: 152
18.08.2010, 17:35  [ТС]     не работает шаблонная функция #7
да вапще без проблем))
условие:
по матрице А размером n*n (n=const), содержащей 0 и 1, строит граф, матрицей смежности которого является А. Граф задаётся динамической структурой.
в принципе представление насчёт решения задачи у меня имеются, вот только на практике проблемы....
вот мой код полностью. здесь должен создаться пустой граф:
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
#include <iostream>
#include <stdio.h>
#include <list>
using namespace std;
 
template <class V, class E>
struct graph
{
struct v_info;
struct e_info;
 
struct v_info
{
V i;
list <e_info> *e;
};
 
struct e_info
{
E i;
list <v_info> *v;
};
 
list <v_info> *v;
};
 
/*template <class T>
struct list
{
T i;
list<T> *next;
};*/
 
template <class V, class E>
void create_complete (graph <V, E> &g, int n);
template <class T>
void list_add(list <T> *&l, T x);
 
const int n=6;
int main()
{
graph <int, int> g;
create_complete (g, n);
return 0;
}
 
template <class V, class E>
void create_complete (graph <V, E> &g, int n)
{
g.v=NULL;
for (int i=0; i<n; i++)
list_add (g.v, graph<V, E>::v_info());
for (list <graph<V, E>::v_info> *p=g.v; p; p=p->next)
{
p->i.e=NULL;
for (int i=0; i<n; i++)
list_add(p->i.e, graph<V, E>::e_info());
list <graph<V, E>::v_info> *r=g.v;
list <graph<V, E>::e_info> *q=p->i.e;
while (r)
{
q->i.v=r;
q=q->next;
r=r->next;
}
}
}
 
template <class T>
void list_add(list <T> *&l, T x)
{
list <T> *n=new list <T>;
n->next=l;
n->i=x;
l=n;
}
ошибки выдаются такого типа:
.\graph.cpp(60) : error C2039: 'next' : is not a member of 'std::list<_Ty>'
.\graph.cpp(62) : error C2228: left of '.e' must have class/struct/union
.\graph.cpp(64) : error C2039: 'i' : is not a member of 'std::list<_Ty>'
Добавлено через 17 минут
код в более наглядном виде)
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
#include <iostream>
#include <stdio.h>
#include <list>
using namespace std;
 
template <class V, class E>
struct graph
{
    struct v_info;
    struct e_info;
 
    struct v_info
    {
        V i;
        list <e_info> *e;
    };
 
    struct e_info
    {
        E i;
        list <v_info> *v;
    };
 
    list <v_info> *v;
};
 
template <class V, class E>
void create_complete (graph <V, E> &g, int n);
template <class T>
void list_add(list <T> *&l, T x);
 
const int n=6;
int main()
{
    int a[n][n];
    a[0][0]=1;
    a[1][0]=1; a[1][1]=0;
    a[2][0]=0; a[2][1]=1; a[2][2]=0;
    a[3][0]=0; a[3][1]=0; a[3][2]=1; a[3][3]=0;
    a[4][0]=1; a[4][1]=1; a[4][2]=0; a[4][3]=1; a[4][4]=0;
    a[5][0]=0; a[5][1]=0; a[5][2]=0; a[5][3]=1; a[5][4]=0; a[5][5]=0;
    graph <int, int> g; 
    create_complete (g, n);
    return 0;
}
 
template <class V, class E>
void create_complete (graph <V, E> &g, int n)
{
    g.v=NULL;
    for (int i=0; i<n; i++)
        list_add (g.v, graph<V, E>::v_info());
    for (list <graph<V, E>::v_info> *p=g.v; p; p=p->next)
    {
        p->i.e=NULL;
        for (int i=0; i<n; i++)
            list_add(p->i.e, graph<V, E>::e_info());
        list <graph<V, E>::v_info> *r=g.v;
        list <graph<V, E>::e_info> *q=p->i.e;
        while (r)
        {
            q->i.v=r;
            q=q->next;
            r=r->next;
        }
    }
}
 
template <class T>
void list_add(list <T> *&l, T x)
{
    list <T> *n=new list <T>;
    n->next=l;
    n->i=x;
    l=n;
}
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
18.08.2010, 18:01     не работает шаблонная функция #8
А что это вы за поле next пытаетесь в стандартном списке нащупать? Его там нет. Как и все стандартные контейнеры, стандартный список обходят с помощью итераторов.
Flamе
9 / 9 / 0
Регистрация: 25.10.2009
Сообщений: 152
18.08.2010, 23:00  [ТС]     не работает шаблонная функция #9
вот именно что здесь я чисто всё на ощупь делаю)) препод походу мой вопрос как раз про это не понял (ну скорее всего сам вопрос был сформулирован коряво, ибо когда не знаешь в чём проблема трудно спросить как её решить)) он сказал что функция list_add шаблонная и всё будет работать.... вот и пришлось использовать list_add для односвязных списков...))
а вот о контейнерах вапще ничего не знаю...
так не подскажете что с этой функцией сделать??
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
18.08.2010, 23:07     не работает шаблонная функция #10
Цитата Сообщение от Flamе Посмотреть сообщение
#include <list>
когда вы это добавляли, чем вы руководствовались?
Flamе
9 / 9 / 0
Регистрация: 25.10.2009
Сообщений: 152
18.08.2010, 23:43  [ТС]     не работает шаблонная функция #11
так же помощью с этого форума) до этого у меня и структура графа работать не хотела))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2010, 21:43     не работает шаблонная функция
Еще ссылки по теме:

Шаблонная функция C++
C++ Как работает шаблонная функция countof?
C++ Шаблонная функция не работает

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

Или воспользуйтесь поиском по форуму:
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
19.08.2010, 21:43     не работает шаблонная функция #12
Я сколько живу пользовался только двумя методами представления графов: матрицей смежности, когда она небольшая, и списком смежных вершин, причем реализация последнего:
C++
1
2
3
4
typedef vector<int> VI;
typedef vector<VI> VVI;
 
VVI G(n); // где ен - количество вершин
Yandex
Объявления
19.08.2010, 21:43     не работает шаблонная функция
Ответ Создать тему
Опции темы

Текущее время: 23:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru