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

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

Восстановить пароль Регистрация
 
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
25.08.2011, 17:26     проблема с шаблоннами #1
Доброго времени суток!

Пишу структуру граф. Есть дескриптор вершины и ребра (класс 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.

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

C++ Проблема с фукнцией.
Проблема C++
C++ проблема с задачкой
Проблема с композицией C++
Проблема с do-while C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LosAngeles
Заблокирован
25.08.2011, 17:57     проблема с шаблоннами #2
такое впечатление, что вертекс - шаблон судя по ошибкам, специализируй его

Добавлено через 32 секунды
и скобки в конце убери
Сыроежка
Заблокирован
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 вам следует убрать круглые скобки.
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;
    };
LosAngeles
Заблокирован
26.08.2011, 16:36     проблема с шаблоннами #5
ну ты везде указатели используешь и внутри *InserV ничего не зависит от параметров шаблона, так можно делать, как обобщенный указатель работает.
можно значительно сократить эту

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

Добавлено через 4 минуты
и параметры по умолчанию тебе в помощь
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
26.08.2011, 16:48  [ТС]     проблема с шаблоннами #6
Не до конца понимаю( Можешь на примере показать?
LosAngeles
Заблокирован
26.08.2011, 17:06     проблема с шаблоннами #7
ну ты выложи шаблон этого вертекса я исправлю, если немного конечно
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 в дескриптор вершины.
 
};
LosAngeles
Заблокирован
26.08.2011, 17:16     проблема с шаблоннами #9
Graph и Edge покажи, здесь сократить ничего нельзя
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*>;
    };
};
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;
}
здесь в параметрах достаточно передавать вес и содержимое вершин в шаблон класса ребра, что впринципе проще и логичней
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2011, 20:33     проблема с шаблоннами
Еще ссылки по теме:

C++ Проблема с массивом.
C++ в чём проблема?

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

Или воспользуйтесь поиском по форуму:
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
26.08.2011, 20:33  [ТС]     проблема с шаблоннами #12
Спасиб!
Yandex
Объявления
26.08.2011, 20:33     проблема с шаблоннами
Ответ Создать тему
Опции темы

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