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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Идентификатор не найден http://www.cyberforum.ru/cpp-beginners/thread903550.html
#include "StdAfx.h" #include "iostream" // для cin и cout //#include "conio.h" // для getch #include "cmath" // для выполнения мат. вычислений //#include "locale.h" // для printf и setlocale ...
C++ Пример с учебника Дэвиса. Необьявленный идендификатор Всем доброго времени суток! В книжке такой пример: // BitTest — инициируются две переменные и // выводятся результаты выполнения // операторов ~,&,| и ^ #include <stdio.h> #include <iostream>... http://www.cyberforum.ru/cpp-beginners/thread903542.html
Дан линейный вещественный массив а. Найти C++
Дан линейный вещественный массив а. Найти a*x+a*x^2+..+a*x^n. (х дано).
C++ Определить максимальное количество подряд идущих положительных элементов массива, не прерываемых ни нулями, ни отрицательными элементами
помогите с этой задачей)) Дан линейный вещественный массив a1,a2,..,an. Определить максимальное количество подряд идущих положительных элементов массива, не прерываемых ни нулями, ни отрицательными...
C++ Написать функцию (или макроопределение), которая находит длину стороны по координатам его точек http://www.cyberforum.ru/cpp-beginners/thread903524.html
Помогите пожалуйста исправить ошибки условие Написать функцию (или макроопределение), которая находит длину стороны по координатам его точек.. Написать функцию square, которая вычисляет площадь...
C++ Собственный класс итератора Добрый день! Пишу сейчас одну библиотеку (не использующею STL и другие библиотеки) и для контейнеров решил написать класс итератора: /// Представляет поэлементный доступ к элементам коллекции... подробнее

Показать сообщение отдельно
vasya-gaykin
Сообщений: n/a

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

16.06.2013, 17:29. Просмотров 464. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru