19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
|
||||||||||||||||
1 | ||||||||||||||||
Использование указателя на объект шаблонного класса в шаблонном классе.12.08.2011, 10:15. Показов 6106. Ответов 26
Метки нет Все метки)
(
Всем привет!
Мне нужно реализовать граф. Начал с вершин и ребер, причем и ребра и вершины - шаблонные классы, для того чтобы и ребро и вершина могли содержать разные данные. В ребре указатели на 2 вершины. Класс вершины:
1>c:\users\артем\documents\visual studio 2010\projects\kp2\kp2\Vertex.cpp(6): error C2955: Vertex: для использования класса шаблон требуется список аргументов шаблон Подскажите, пожалуйста, в чем дело?
0
|
|
12.08.2011, 10:15 | |
Ответы с готовыми решениями:
26
Создать объект шаблонного класса в другом классе Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра? Определение класса в шаблонном классе Хранение в map указателя на функцию-член шаблонного класса |
49 / 49 / 4
Регистрация: 31.01.2011
Сообщений: 156
|
|
12.08.2011, 10:28 | 2 |
У тебя в классе Edge объявляется куча объектов типа Vertex без списка аргументов шаблона, хотя класс Vertex - шаблонный класс
Странное решение.. Я никогда не работал с графами (только читал о них), но для меня ребро - это абстрактная линия, которая связывает два узла, не более (т.е. на деле это указатель на узел2 из узла1)
1
|
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
|
|
12.08.2011, 10:31 [ТС] | 3 |
Ага, с этим разобрался.
По поводу ребер - это спецификация такая. "АТД «Дескриптор ребра графа» Дескриптор ребра содержит поля: v1 - дескриптор вершины, из которой исходит ребро, v2 - дескриптор вершины, в которую входит ребро, w - вес ребра, data - данные, связанные с ребром"
0
|
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
|
|
12.08.2011, 21:23 [ТС] | 5 |
А что, если Edge не шаблонный, а обычный класс?
Как быть в этом случае?
0
|
Android Programmer
140 / 141 / 10
Регистрация: 08.12.2010
Сообщений: 421
|
||||||
12.08.2011, 21:34 | 6 | |||||
ну указывайте тогда явно тип:
1
|
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
|
||||||
12.08.2011, 21:45 [ТС] | 7 | |||||
Не совсем то. Теперь, при такой записи
error C2664: Edge<TT>::Edge(Vertex<T> *,Vertex<T> *): невозможно преобразовать параметр 1 из "Vertex<T> *" в "Vertex<T> * То есть требуется чтобы и у объекта e1, e2 и rebro совпадал тип. А нужно, чтобы можно было создавать объекты разных типов.
0
|
Заблокирован
|
|
13.08.2011, 04:54 | 8 |
У вас вообще непонятно, какова связь между этими классами, и какова сама структура классов. Так, например, в Edge я вижу, что вы некоторому полю с именем data присваиваете значение переменной dat. Откуда это поле data взялось? Я не вижу его определения в классе Edge.
0
|
13.08.2011, 09:32 | 9 | |||||
Вот смотри:
![]()
1
|
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
|
||||||
13.08.2011, 22:58 [ТС] | 10 | |||||
Да, вот тут все работает как надо, но как создать в классе B объект класса A так, чтобы он тоже не был конкретным?? А что - то типа
0
|
![]() 2377 / 1661 / 279
Регистрация: 29.05.2011
Сообщений: 3,395
|
||||||
13.08.2011, 23:10 | 11 | |||||
Для этого надо передавать TT вторым параметром шаблона
0
|
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
|
|
13.08.2011, 23:15 [ТС] | 12 |
0
|
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
|
||||||
13.08.2011, 23:19 [ТС] | 13 | |||||
К этому решению я приходил не раз
![]() В том числе и шаблонный параметр в шаблоне и так далее) Суть в том, что при этом если я создам объект класса В то это нужно будет делать так:
![]()
0
|
![]() 2377 / 1661 / 279
Регистрация: 29.05.2011
Сообщений: 3,395
|
||||||
13.08.2011, 23:45 | 14 | |||||
А зачем в объект класса B<int, int> пытаться засунуть A<char*> ? Может для этого всё-таки нужно B<int, char*> ? А если нужно держать там указатели на A с произвольным параметром, то я знаю единственный способ — унаследовать A<> от нешаблонного виртуального класса и использовать полиморфизм. Только виртуальные функции ведь тоже не смогут быть шаблонными.
Ну и все достоинства/недостатки виртуальности... Пример:
1
|
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
|
|
14.08.2011, 00:10 [ТС] | 15 |
Да - да, вы правильно поняли. "держать там указатели на A с произвольным параметром".
И вот еще, я правильно понял, что "Только виртуальные функции ведь тоже не смогут быть шаблонными" это значит что я не могу определить в классе A_Base метод, который вернет значение типа параметра шаблона? И это приведет к тому, что все методы класса A не объявленные в классе A_Base я не смогу использовать в B, так? Если так, то вряд ли мне это подойдет. Нет ли еще какого способа "держать там указатели на A с произвольным параметром"?
0
|
![]() 2377 / 1661 / 279
Регистрация: 29.05.2011
Сообщений: 3,395
|
|
14.08.2011, 00:31 | 16 |
Ну я имел в виду, что параметры и возвращаемые значения виртуальных функций не могут иметь тип параметра шаблона, так как это будет перегрузка.
Ага. А как можно использовать в B какие-либо функции из A, если неизвестно, есть ли там такие функции и какого типа аргументы они принимают? Другого хорошего способа я не знаю. Есть ещё указатель void*, но чтобы использовать объект по такому указателю надо будет его явно приводить к указателю на конкретный тип.
0
|
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
|
|
14.08.2011, 00:45 [ТС] | 17 |
Ладно, наверное придется обойтись без произвольного типа)
А так хотелось)))))))))))))))))
0
|
![]() 2345 / 1718 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
14.08.2011, 00:47 | 18 |
gretham, как Вы собираетесь с этим параметром произвольного типа работать?
0
|
![]() 2377 / 1661 / 279
Регистрация: 29.05.2011
Сообщений: 3,395
|
|
14.08.2011, 00:48 | 19 |
Собственно указатель на A_Base всегда можно попытаться привести к конкретному классу-наследнику, тем более что можно в рантайме проверять корректность такого приведения.
Возможно если будет пример, как надо использовать невесть какую функцию из невесть какого класса, то может какая идея и родиться.
0
|
19 / 19 / 1
Регистрация: 12.08.2011
Сообщений: 59
|
|
14.08.2011, 01:07 [ТС] | 20 |
0
|
14.08.2011, 01:07 | |
Помогаю со студенческими работами здесь
20
Объявление шаблона класса, а в классе объявляется массив шаблонного типаа
Использование фабрики для шаблонного класса
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |