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

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

Войти
Регистрация
Восстановить пароль
 
vasya-gaykin
Сообщений: n/a
#1

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

16.06.2013, 17:29. Просмотров 463. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2013, 17:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функциональные шаблоны и наследование (C++):

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

Наследование и шаблоны - C++
Доброго времени суток всем! Требуется внести ясность в следующую задачу. Существует абстрактный класс AbstractGenerator&lt;имя типа&gt; (не...

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
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
vasya-gaykin
Сообщений: n/a
16.06.2013, 17:42 #3
Спасибо большое!
А с чем связан такой синтаксис? не объясните в двух словах?
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.06.2013, 17:45 #4
с тем что шаблоны недопускают неявных преобразований
0
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
16.06.2013, 22:25 #5
В функции main замените:

B* b = new B();

A* b = new B();
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2013, 22:25
Привет! Вот еще темы с ответами:

Шаблоны, наследование и размер типа - C++
Суть вопроса в том, что имея два шаблона класса, унаследованных от общего предка, и инстанциируя &quot;один другим&quot; имеем + n байт к размеру...

Не могу разобраться с ошибками, наследование и шаблоны - C++
Задание: Смоделировать стек на базе статического массива по заданию. Написать основные операции для работы со стеком (push, pop, top,...

[Классы, Наследование, Шаблоны] Добавление записи в список - C++
В данной программе используется наследование с применением шаблонов класса. В другой похожей программе не используя наследования программа...

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». - C++
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если есть, то в чём? И где (в каких...


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

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

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