Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
#1

Шаблоны и параметр по умолчанию - C++

27.07.2013, 18:28. Просмотров 696. Ответов 13
Метки нет (Все метки)

Добрый день. Вроде всё делаю по учебнику, но компилятор не пропускает:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <vector>
#include <cstdlib>
 
template<class T>
bool DefaultComparand(const T &, const T &);
 
template<class T, class Function = DefaultComparand<T>>
void Ssort(std::vector<T>& base, Function fn = DefaultComparand<T>() )
{
    int n = base.size();
 
    for (int gap = n / 2; 0 < gap; gap /= 2)
    {
        for (int i = gap; i < n; ++i)
        {
            for (int j = i - gap; 0 <= j; j -= gap)
            {
                if ( fn(base[j+gap], base[j]) == true )
                {
                    T temp = base[j];
                    base[j] = base[j+gap];
                    base[j+gap] = temp;
                }
            }
        }
    }
}
 
template<class T>
bool DefaultComparand(const T& first, const T& second)
{
    return first < second;
}
 
template<class BeginIterator, class EndIterator, class Function>
void For_Each(BeginIterator first, EndIterator last, Function fn)
{
    while (first != last)
    {
        fn(*first++);
    }
}
 
void Random(int& obj)
{
    obj = rand() % 100;
}
 
void Show(const int& obj)
{
    std::cout << obj << ' ';
}
 
int main()
{
    std::vector<int> vec(10);
 
    For_Each(vec.begin(), vec.end(), Random);
    For_Each(vec.begin(), vec.end(), Show);
    std::cout << '\n';
    Ssort(vec);
    For_Each(vec.begin(), vec.end(), Show);
    std::cout << '\n';
}
Добавлено через 3 минуты
Bash
1
2
3
4
5
6
main.cpp:8:54: error: spurious ‘>>’, use ‘>’ to terminate a template argument list
main.cpp:8:36: error: expected type-specifier
main.cpp:8:36: error: expected ‘>’
main.cpp:10:1: error: expected unqualified-id before ‘{’ token
main.cpp: In function ‘int main()’:
main.cpp:62:14: error: ‘Ssort’ was not declared in this scope
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2013, 18:28
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Шаблоны и параметр по умолчанию (C++):

Шаблоны классов. Ошибка параметра по умолчанию
Есть template &lt;class data_type&gt; class List; и typedef unsigned char...

Параметр шаблона ostream_iterator по умолчанию
Помогите найти ошибку, не могу понять в чем проблема:#include &lt;iostream&gt;...

шаблоны: не могу обеспечить реализацию значения по умолчанию для инициализации элементов вектора
Здравствуйте! Помогите пожалуйста разобраться с таким вот: у меня есть...

Почему нельзя в конструкторе использовать параметр по умолчанию, если конструктор не встроен?
То есть честно говоря, вопрос так надо ставить: почему если конструктор...

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами».
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в...

Шаблоны. Плохо понимаемые моменты из книги "Шаблоны С++. Справочник разработчика". (Вандевурд, Джосаттис)
Так как изучаю эту книгу, то в некоторых местах возникают вопросы. Чтобы не...

13
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
27.07.2013, 18:34 #2
Цитата Сообщение от xtorne21st Посмотреть сообщение
template<class T, class Function = DefaultComparand<T>>
Вставьте пробел между ">>".
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
27.07.2013, 18:37  [ТС] #3
Идея заключается в том, что если в функции Ssort не задать 2-й параметр (функцию для сравнения), то алгоритм будет использовать функцию по-умолчанию.

Добавлено через 2 минуты
Убежденный, любые манипуляции с пробелами венчаются неудачей (компилятор gcc если что).
0
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
27.07.2013, 18:46 #4
Вот что пишет Visual C++ по поводу Ssort:
Default template arguments are allowed only on a class template declaration or definition.
Default template arguments may not be used in a function template, or in the definition of a
member of a class template.
1
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
27.07.2013, 18:58  [ТС] #5
Убежденный, как же тогда устроена библиотека stl? Там все алгоритмы на этих параметрах по умолчанию...
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.07.2013, 19:21 #6
xtorne21st, перегрузка же

Добавлено через 1 минуту
Цитата Сообщение от xtorne21st Посмотреть сообщение
C++
1
int n = base.size();
размер вектора ну никак не знаковое целое
1
vendetta17
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 8
27.07.2013, 19:22 #7
Цитата Сообщение от Jupiter Посмотреть сообщение
размер вектора ну никак не знаковое целое
size_t?
0
Olivеr
412 / 408 / 95
Регистрация: 06.10.2011
Сообщений: 832
27.07.2013, 19:25 #8
xtorne21st,
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <vector>
#include <cstdlib>
 
template<class T>
struct DefaultComparand
{
    bool operator () (const T &first, const T &second)
    {
        return first < second;
    }
};
 
template<class T, class Function = DefaultComparand<T>>
void Ssort(std::vector<T>& base, Function fn = DefaultComparand<T>() )
{
    int n = base.size();
 
    for (int gap = n / 2; 0 < gap; gap /= 2)
    {
        for (int i = gap; i < n; ++i)
        {
            for (int j = i - gap; 0 <= j; j -= gap)
            {
                if ( fn(base[j+gap], base[j]) == true )
                {
                    T temp = base[j];
                    base[j] = base[j+gap];
                    base[j+gap] = temp;
                }
            }
        }
    }
}
 
template<class BeginIterator, class EndIterator, class Function>
void For_Each(BeginIterator first, EndIterator last, Function fn)
{
    while (first != last)
    {
        fn(*first++);
    }
}
 
void Random(int& obj)
{
    obj = rand() % 100;
}
 
void Show(const int& obj)
{
    std::cout << obj << ' ';
}
 
int main()
{
    std::vector<int> vec(10);
 
    For_Each(vec.begin(), vec.end(), Random);
    For_Each(vec.begin(), vec.end(), Show);
    std::cout << '\n';
    Ssort(vec);
    For_Each(vec.begin(), vec.end(), Show);
    std::cout << '\n';
}
1
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.07.2013, 19:25 #9
Цитата Сообщение от vendetta17 Посмотреть сообщение
size_t
угу, ну и для параноиков std::vector<T>::size_type
0
Olivеr
412 / 408 / 95
Регистрация: 06.10.2011
Сообщений: 832
27.07.2013, 19:25 #10
я всего лишь поменял ваш компатор на
C++
1
2
3
4
5
6
7
8
template<class T>
struct DefaultComparand
{
    bool operator () (const T &first, const T &second)
    {
        return first < second;
    }
};
1
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
27.07.2013, 19:46  [ТС] #11
Цитата Сообщение от Jupiter Посмотреть сообщение
размер вектора ну никак не знаковое целое
Это сильно принципиально? Всё работает и так

Добавлено через 9 минут
Всем спасибо всё работает.
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.07.2013, 20:16 #12
Цитата Сообщение от xtorne21st Посмотреть сообщение
Это сильно принципиально? Всё работает и так
это потенциальный ворнинг при компиляции
0
Croessmah
28.07.2013, 02:30
  #13

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение
это потенциальный ворнинг при компиляции
Это потенциальное переполнение

0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
31.07.2013, 18:41  [ТС] #14
как оказалось, фича с параметрами по-умолчанию доступна только в новом стандарте. Это объясняет причину использования перегруженного шаблона (как отмечено на сайте cplusplus).
0
31.07.2013, 18:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2013, 18:41
Привет! Вот еще темы с решениями:

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны
В одномерном массиве, состоящем из п вещественных элементов, вычислить: 1)...

Параметр функции по умолчанию
Пишу функции, у которой может быть параметр по умолчанию вот код int...

Параметр не имеет значения по умолчанию
Всем привет. Проблема такая. Есть база данных,со связями. Задача состоит в...

Параметр не имеет значения по умолчанию
Параметр Код_врача не имеет значения по умолчанию Вот код: var help1, help2:...


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

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

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