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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
#1

проблема с шаблоннами - C++

25.08.2011, 17:26. Просмотров 700. Ответов 11
Метки нет (Все метки)

Доброго времени суток!

Пишу структуру граф. Есть дескриптор вершины и ребра (класс Vertex и класс Edge). При создании объекта граф
C++
1
2
3
4
void main()
{
    Graph<Vertex, Edge> g1();
};
возникаеют ошибки:

error C2955: 'Vertex' : use of class template requires template argument list
и
error C3203: 'Vertex' : unspecialized class template can't be used as a template argument for template parameter 'Vertex', expected a real type.

Тоже самое с типом ребра. Подскажите в чем может заключатся ошибка.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2011, 17:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос проблема с шаблоннами (C++):

Проблема - Сетевое оборудование
Привет Проблема началась неделю назад. Дело в том, все время разъединяет интернет коннект и при етом модем какбудто перезагружается....

проблема с ie - Софт
Парни такая проблема: пользуешься инетом через Iе и после где-то минуты показывает окно майкрософт отправить ошибку или не отправлять, и...

проблема в IE - Софт
подскажите пожалуйста нубу как избавиться от картинки/банера при входе в IE.. А точнее когда я запускаю IE появляется стартовая страница, а...

Проблема - Pascal ABC
Есть прога unit MainForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...

проблема с Like - MS Access
Почемуто не работает если ставить символ %. Если полное название писать то оно выбирает, а если первых два символа и потом ставить % то...

Проблема - Windows 7
привет всем тут такая проблема с виндой 7й ноут работал нормально ни каких проблем тут вчера его выключил проснулся утром а он мне пишет...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
LosAngeles
Заблокирован
25.08.2011, 17:57 #2
такое впечатление, что вертекс - шаблон судя по ошибкам, специализируй его

Добавлено через 32 секунды
и скобки в конце убери
1
Сыроежка
Заблокирован
25.08.2011, 18:50 #3
Цитата Сообщение от Den4ik Посмотреть сообщение
Доброго времени суток!

Пишу структуру граф. Есть дескриптор вершины и ребра (класс Vertex и класс Edge). При создании объекта граф
C++
1
2
3
4
void main()
{
    Graph<Vertex, Edge> g1();
};
возникаеют ошибки:

error C2955: 'Vertex' : use of class template requires template argument list
и
error C3203: 'Vertex' : unspecialized class template can't be used as a template argument for template parameter 'Vertex', expected a real type.

Тоже самое с типом ребра. Подскажите в чем может заключатся ошибка.
На самом деле у вас данное определение объекта, как вы думаете, является объявлением функции, которая возвращает значение Graph<Vertex, Edge>. Поэтому после g1 вам следует убрать круглые скобки.
0
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
26.08.2011, 11:37  [ТС] #4
И со скобками и с шаблонами очень затупил...
Понимаю нужно было сделать так?

C++
1
2
3
4
5
6
#include "Graph.h"
 
void main()
{
      Graph<Vertex<int,int>,Edge<Vertex<int,int>,int,int>> g1;
};
Только вот не пойму, когда вызывается метод вставки вершины класса граф, прокатывает без этого.
C++
1
2
3
4
5
6
7
8
Vertex *InserV (Vertex *vx)
    {
        v->push_back(vx);
        vx->index = cnt_v;
        cnt_v ++;
        Adjlist.push_back(list<Edge *>());
        return vx;
    };
0
LosAngeles
Заблокирован
26.08.2011, 16:36 #5
ну ты везде указатели используешь и внутри *InserV ничего не зависит от параметров шаблона, так можно делать, как обобщенный указатель работает.
можно значительно сократить эту

Цитата Сообщение от Den4ik Посмотреть сообщение
Graph<Vertex<int,int>,Edge<Vertex<int,int>,int,int>> g1;
запись, если использовать шаблонные параметры шаблонов

Добавлено через 4 минуты
и параметры по умолчанию тебе в помощь
0
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
26.08.2011, 16:48  [ТС] #6
Не до конца понимаю( Можешь на примере показать?
0
LosAngeles
Заблокирован
26.08.2011, 17:06 #7
ну ты выложи шаблон этого вертекса я исправлю, если немного конечно
0
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
26.08.2011, 17:12  [ТС] #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once;
 
template <class Name, class Data> class Vertex
{
private:
    Name name;                  //имя вершины, 
    Data data;                  //данные, связанные с вершиной,
                    
public:
    int index;                                          // – индекс вершины в структуре графа или -1,
    Vertex () { name = 0; data = 0; index = -1;};
    Vertex(Name _n, Data _v) { name = _n; value = _v; index = -1; }
    //Vertex (char _n, int _v, int _i) { name = _n; data = _v; index = _i;}; 
    Vertex(Vertex<Name, Data> *Vr) { name = Vr->name; data = Vr->data; index = Vr->index; };
                            
    Name GetName(void) { return name;};                 // - возвращает имя вершины,
    Data GetData(void) { return data;};                     // - возвращает данные, связанные с вершиной,
    void SetName(Name _name) { name = _name};               // – задает имя вершины,
    void SetData(Data _data) { data = _data;};              // – записывает данные data в дескриптор вершины.
 
};
0
LosAngeles
Заблокирован
26.08.2011, 17:16 #9
Graph и Edge покажи, здесь сократить ничего нельзя
0
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
26.08.2011, 17:25  [ТС] #10
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
#include "Vertex.h" 
 
template <class Vertex, class Weight, class Data> class Edge
{
private:
    
    Weight weight;
    Data data;
 
public: 
    Vertex *from, *to;      //- дескриптор вершины, из которой исходит ребро,дескриптор вершины, в которую входит ребро,
    int index;
    Edge(Vertex* _from, Vertex* _to){from = _from; to = _to; weight = 1; data = 0;index = -1;};
    Edge(Vertex* _from, Vertex* _to, Weight _w){ from = _from; to = _to; weight = _w; data = 0;index = -1;};
    Edge(Vertex* _from, Vertex* _to, Weight _w, Data _data){from = _from; to = _to; weight = _w; data = _data;index = -1;};
    //~Edge(){delete from; delete to; delete data; delete w;};
 
    Vertex* v1(void){return from;};                 //- возвращает дескриптор вершины, из которой исходит ребро,
    
    Vertex* v2(void){return to;};                   //- возвращает дескриптор вершины, в которую входит ребро,
    
    bool From (Vertex* v)                           //- возвращает признак исхода ребра из заданной вершины v,
    {
        if (v == from) return true;
        return false;
    }; 
    
    bool other(Vertex* v)                           //- возвращает дескриптор вершины, связанной с вершиной v данным ребром,
    {   
        if (v == from || v  == to) return true;
        return false; 
    }; 
 
    bool has (Vertex* v)
    {
        if (v->index != -1)return true;
        return false;
    };      
    Weight GetW (void) {return weight;};                    //- возвращает вес ребра,
    void SetW (Weight _w){weight = _w;};                    //- изменение веса ребра,
    Data GetData(void) {return data;};              //- возвращает данные, связанные с ребром,
    void SetData(Data _data) {data = _data;};       // - изменение данных, связанных с ребром.
 
};

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "ABCGraph.h"
#include "LGraph.h"
#include "MGraph.h"
#pragma once;
 
template <class Vertex, class Edge> class Graph
{
protected:
    ABCG <Vertex, Edge> *abstr;
public:
    Graph()             
    {
        abstr = new LGraph<Vertex, Edge>(); // По умолчанию граф имеет L-представление
    };
};
L-граф
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <class Vertex, class Edge> class LGraph: public ABCG <Vertex, Edge> 
{
private: 
    vector<list<Edge *>> Adjlist;
    bool directed;
    int cnt_v, cnt_e;
 
public: 
    LGraph()
    {
        cnt_v = 0; cnt_e = 0;
        directed = false;
        v = new vector<Vertex*>;
        e = new vector<Edge*>;
    };
};
0
LosAngeles
Заблокирован
26.08.2011, 18:02 #11
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
template <class Data = int, class Name = int> class Vertex
{
private:
        Name name;                                      //имя вершины, 
        Data data;                                      //данные, связанные с вершиной,
                                        
public:
        int index;                                                                                      // – индекс вершины в структуре графа или -1,
        Vertex () { name = 0; data = 0; index = -1;};
        Vertex(Name _n, Data _v) { name = _n; value = _v; index = -1; }
        //Vertex (char _n, int _v, int _i) { name = _n; data = _v; index = _i;}; 
        Vertex(Vertex<Name, Data> *Vr) { name = Vr->name; data = Vr->data; index = Vr->index; };
                                                        
        Name GetName(void) { return name;};                                     // - возвращает имя вершины,
        Data GetData(void) { return data;};                                             // - возвращает данные, связанные с вершиной,
        void SetName(Name _name) { name = _name};                               // – задает имя вершины,
        void SetData(Data _data) { data = _data;};                              // – записывает данные data в дескриптор вершины.
 
};
 
template <typename Weight = int, typename Data = int, template <typename D, typename N = int> class _Vertex = Vertex> class Edge
{
private:
        
        Weight weight;
        Data data;
 
public: 
        _Vertex<Data> *from, *to;              //- дескриптор вершины, из которой исходит ребро,дескриптор вершины, в которую входит ребро,
        int index;
        Edge() {};
        Edge(_Vertex<Data>* _from,_Vertex<Data>* _to){from = _from; to = _to; weight = 1; data = 0;index = -1;};
        Edge(_Vertex<Data>* _from, _Vertex<Data>* _to, Weight _w){ from = _from; to = _to; weight = _w; data = 0;index = -1;};
        Edge(_Vertex<Data>* _from, _Vertex<Data>* _to, Weight _w, Data _data){from = _from; to = _to; weight = _w; data = _data;index = -1;};
        //~Edge(){delete from; delete to; delete data; delete w;};
 
        _Vertex<Data>* v1(void){return from;};                                 //- возвращает дескриптор вершины, из которой исходит ребро,
        
        _Vertex<Data>* v2(void){return to;};                                   //- возвращает дескриптор вершины, в которую входит ребро,
        
        bool From (_Vertex<Data>* v)                                                   //- возвращает признак исхода ребра из заданной вершины v,
        {
                if (v == from) return true;
                return false;
        }; 
        
        bool other(_Vertex<Data>* v)                                                   //- возвращает дескриптор вершины, связанной с вершиной v данным ребром,
        {       
                if (v == from || v  == to) return true;
                return false; 
        }; 
 
        bool has (_Vertex<Data>* v)
        {
                if (v->index != -1)return true;
                return false;
        };              
        Weight GetW (void) {return weight;};                                    //- возвращает вес ребра,
        void SetW (Weight _w){weight = _w;};                                    //- изменение веса ребра,
        Data GetData(void) {return data;};                              //- возвращает данные, связанные с ребром,
        void SetData(Data _data) {data = _data;};               // - изменение данных, связанных с ребром.
 
};
 
int main(int argc, char *argv[])
{
    new Edge<int, int>();
    
    return 0;
}
здесь в параметрах достаточно передавать вес и содержимое вершин в шаблон класса ребра, что впринципе проще и логичней
1
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
26.08.2011, 20:33  [ТС] #12
Спасиб!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2011, 20:33
Привет! Вот еще темы с ответами:

проблема - Удаление вирусов
после того как почистила компютер от вирусов, перестало отoбражатся видео и музыка. флeш плеер переустанавливала, браузер тоже......

Проблема - Wi-Fi
3 дня назад подключил wifi,после этого начались такие проблемы,когда захожу на сервер программы teamspeak 3,то у меня через секунд 20...

Проблема - HTML, CSS
Добрый вечер. Почему вокруг надписи нет рамки? &lt;html&gt; &lt;head&gt; &lt;title&gt;Yout Output&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;h1&gt;Your Output&lt;/h1&gt; ...

ПРОБЛЕМА - PHP
Надо написать программу: Написать функцию, которая возвращает максимальное из двух чисел, полученных в качестве аргумента. аргументы...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.08.2011, 20:33
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru