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

Функциональные шаблоны и наследование

16.06.2013, 17:29. Показов 955. Ответов 4
Метки нет (Все метки)

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
#include <list>
 
using namespace std;
 
class A {
    public:
        virtual void doit() =0;
};
 
 
class B: public A {
    public:
        virtual void doit() {};
};
 
 
// чтобы списки можно было заполнять как в Qt:
// list<int> L;
// L << 10 << 20 << 30
template<class T> list<T>& operator<<(list<T>& list, T value) {
    list.push_back(value);
    return list;
}
 
// Специализируем шаблон для случая list<Указатель>
template<class T> list<T*>& operator<<(list<T*>& list, T* value) {
    list.push_back(value);
    return list;
}
 
int main(int argc, char* argv[]) {
    list<A*> alist;
    B* b = new B();
    alist.push_back(b); // OK
    alist << b; // error
 
    return 0;
}
Данный код не компилится, и затыкается на строчке 35. Но если в шаблон внести небольшое изменение то все
проходит на ура. Изменение следующее:
строчку 26 привести к следующему виду
C++
1
template<class T> list<T*>& operator<<(list<T*>& list, A* value)
(измениля второй параметр в сигнатуре функции)

Такое положение кажется странным. У Страуструпа в "Язык программирования С++ Специальное издание" в
главе "Специализация" (стр.: 420) имеем:

C++
1
2
3
template<class T> class Vector;    // общий шаблон
template<> class Vector<T*>;       // специализация для любых указателей
template<> class Vector<void*>;    // специализация для void*
Второй пример, кажется, это как раз по теме моего вопроса. Но почему-то не срабатывает...
Компилятор: gcc версия 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.06.2013, 17:29
Ответы с готовыми решениями:

Наследование и шаблоны
Здравствуйте. У меня возникла проблема. Есть 4 класса: Father - абстрактный шаблонный класс...

Наследование и шаблоны
Не понимаю почему выдается ошибки, переменные а, b не объявлены в данном контексте (внутри функции...

Наследование и шаблоны
Доброго времени суток всем! Требуется внести ясность в следующую задачу. Существует абстрактный...

Наследование и шаблоны
Доброе время суток. Есть три класс: interface.h template &lt;class T&gt; class interface ...

4
Каратель
Эксперт С++
6606 / 4025 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
16.06.2013, 17:36 2
C++
1
2
3
4
5
6
template<class T, class U> 
list<T*>& operator<<(list<T*>& list, U* value)
{
    list.push_back(value);
    return list;
}
0
0 / 0 / 0
Регистрация: 13.10.2016
Сообщений: 5
16.06.2013, 17:42 3
Спасибо большое!
А с чем связан такой синтаксис? не объясните в двух словах?
0
Каратель
Эксперт С++
6606 / 4025 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
16.06.2013, 17:45 4
с тем что шаблоны недопускают неявных преобразований
0
Ушел с форума
Эксперт С++
16450 / 7414 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
16.06.2013, 22:25 5
В функции main замените:

B* b = new B();

A* b = new B();
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2013, 22:25
Помогаю со студенческими работами здесь

Шаблоны и наследование
Есть код с учебника: #include &lt;iostream&gt; #include &lt;typeinfo&gt; #include &lt;cstdlib&gt; #include...

Наследование и шаблоны
Почему при использовании шаблонов при обращении к элементам класса нужно явно указывать потомка или...

Наследование, шаблоны классов
Все привет. Есть два шаблона классов, один наследует другой. Первый класс абстрактный, содержит...

Шаблоны, наследование и размер типа
Суть вопроса в том, что имея два шаблона класса, унаследованных от общего предка, и инстанциируя...


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

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

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