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

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

Восстановить пароль Регистрация
 
vasya-gaykin
Сообщений: n/a
16.06.2013, 17:29     Функциональные шаблоны и наследование #1
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     Функциональные шаблоны и наследование
Посмотрите здесь:

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». C++
Наследование и шаблоны C++
C++ Не могу разобраться с ошибками, наследование и шаблоны
C++ Шаблоны, наследование и размер типа
Шаблоны и наследование C++
Наследование и шаблоны C++
Наследование и шаблоны C++
Наследование и шаблоны C++
C++ [Классы, Наследование, Шаблоны] Добавление записи в список
Шаблоны. Плохо понимаемые моменты из книги "Шаблоны С++. Справочник разработчика". (Вандевурд, Джосаттис) C++
C++ Функциональные адаптеры
C++ Наследование и шаблоны

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 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;
}
vasya-gaykin
Сообщений: n/a
16.06.2013, 17:42     Функциональные шаблоны и наследование #3
Спасибо большое!
А с чем связан такой синтаксис? не объясните в двух словах?
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.06.2013, 17:45     Функциональные шаблоны и наследование #4
с тем что шаблоны недопускают неявных преобразований
Убежденный
Системный программист
 Аватар для Убежденный
14457 / 6441 / 1020
Регистрация: 02.05.2013
Сообщений: 10,681
Завершенные тесты: 1
16.06.2013, 22:25     Функциональные шаблоны и наследование #5
В функции main замените:

B* b = new B();

A* b = new B();
Yandex
Объявления
16.06.2013, 22:25     Функциональные шаблоны и наследование
Ответ Создать тему
Опции темы

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