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

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

Войти
Регистрация
Восстановить пароль
 
 
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
#1

Вызов функции (шаблона) - C++

09.06.2013, 22:03. Просмотров 1082. Ответов 18
Метки нет (Все метки)

Здравствуйте. Есть шаблон, никак не получаются его вызвать.
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
template <class T>
void print(const T &a)
{
         int b;
    cout <<"Input number:";
    cin >> b;
    
        const unsigned *p = reinterpret_cast<const unsigned*>(&a);
        for (int i = 0; i < sizeof(T); i++) 
     {
         if (p[i] & 0x80) cout << 1;
         else cout << 0;
         p[i] = p[i] << 1;
     }
     cout << endl;
 
}
 
 
int main()
{
    print(const T &a);
 
    
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2013, 22:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вызов функции (шаблона) (C++):

Вызов функции внутри другой функции с передачей локальной переменной по ссылке - C++
Столкнулся с очень с интересной проблемой. Можно ли так делать? #include &lt;iostream&gt; using std::cout; void f(const int &amp;ref){...

Вызов родовой функции (нужно передать массив в качестве аргумента функции через указатель) - C++
#include &lt;iostream&gt; using namespace std; template &lt;class T1&gt; class mas { public: T1 n; T1 a; void input() ...

Специализация шаблона функции - C++
Как сделать специализированную функцию шаблон на тип int? У меня что-то не получается ..

Создание шаблона функции - C++
#include &lt;iostream&gt; using namespace std; template &lt;class T&gt; T min(T a, T b) { T minVal = a; if (minVal &gt; b) minVal =...

Использование шаблона функции - C++
Есть рабочая програма, но преподаватель попросил её немного упростить. Прошу помочь. Всё приведу ниже. Задание: Осуществить циклический...

Создание шаблона функции - C++
Пожалуйста помогите решить задачу, что то сам никак не могу сообразить((( вот текст: Описать шаблон функции, которая считает сумму...

18
MrGluck
Модератор
Эксперт CЭксперт С++
7510 / 4642 / 700
Регистрация: 29.11.2010
Сообщений: 12,676
09.06.2013, 22:04 #2
Цитата Сообщение от mster-doc Посмотреть сообщение
int main()
{
print(const T &a);
а что вы ему хотите передать?
1
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
09.06.2013, 22:35  [ТС] #3
хочу передать всё (запрос на ввод числа, и результат разложения числа на байты)
0
MrGluck
Модератор
Эксперт CЭксперт С++
7510 / 4642 / 700
Регистрация: 29.11.2010
Сообщений: 12,676
09.06.2013, 22:37 #4
mster-doc, наверное стоит сначала создать объект, а потом передать его функции, не?
И в main никто не знает что такое T, что такое a.
1
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.06.2013, 22:40 #5
ваш шаблон может вызываться как любая другая функция:
C++
1
2
3
print(10);
print(10.0);
print(10u);
Возможно некоторые варианты не скомпиляться, т.к. есть у меня подозрения, что код внутри самого шаблона кривой.
1
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
09.06.2013, 22:42  [ТС] #6
вот я планировал сделать так
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
template <class T>
void print(const T &a)
{  
        const unsigned *p = reinterpret_cast<const unsigned*>(&a);
        for (int i = 0; i < sizeof(T); i++) 
     {
         if (p[i] & 0x80) cout << 1;
         else cout << 0;
         p[i] = p[i] << 1;
     }
     cout << endl;
 
}
 
void printbyte()
{
     int b;
    cout <<"Input number:";
    cin >> b;
    
    print <int> (b);
}
 
 
int main()
{
    printbyte();
 
    
    system("pause");
    return 0;
}
но компилятор пишет мне ошибку в строке
C++
1
print <int> (b);
В смысле создать объект? А разве заводя параметры он не создаётся?
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.06.2013, 22:45 #7
какую ошибку пишет то?
если сами не понимаете, то хоть сюда запостили бы подробный лог.
1
MrGluck
Модератор
Эксперт CЭксперт С++
7510 / 4642 / 700
Регистрация: 29.11.2010
Сообщений: 12,676
09.06.2013, 22:46 #8
Вот вам пример работы с шаблонными функциями:
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Сумму   элементов массива  и максимальное значение произведений
#include <iostream>
#include <cstddef>
#include <conio.h>
 
using namespace std;
 
// <<<<<<<<<<<<<<<---------------прототипы функций--------------->>>>>>>>>>>>>>>
// вывод массива на экран
template <typename T>
void print(const T* , const size_t);
 
// сумма элементов
template <typename T>
T sum(const T* , const size_t);
 
// максимальное произведение соседних элементов
template <typename T>
T maxMult(const T* , const size_t);
 
// сумма и максимальное произведение
template <typename T>
void sumAndMaxMult(const T* , const size_t, T &, T &);
 
// <<<<<<<<<<<<<<<----------------главная функция---------------->>>>>>>>>>>>>>>
int main()
{
    int arr[] = {1, 6, 2, 4, 7};
    const size_t N = sizeof(arr) / sizeof(arr[0]);   // узнаем кол-во элементов
    int res1, res2; // переменные для хранения результата вычислений
    double arr2[] = {1.1, 2.3, 0.0, 7.5};
    const size_t M = sizeof(arr2) / sizeof(arr2[0]); // узнаем кол-во элементов
    double res3, res4; // переменные для хранения результата вычислений
 
    // обрабатываем массив типа int
    print(arr, N);
    sumAndMaxMult(arr, N, res1, res2);
    cout << "Sum: " << sum(arr, N)
         << "\nMax mult: " << maxMult(arr, N)
         << "\nSame by one function:"
         << "\nSum: " << res1
         << "\nMax mult: " << res2 << endl << endl;
 
    // обрабатываем массив типа double
    print(arr2, M);
    sumAndMaxMult(arr2, M, res3, res4);
    cout << "Sum: " << sum(arr2, M)
         << "\nMax mult: " << maxMult(arr2, M)
         << "\nSame by one function:"
         << "\nSum: " << res3
         << "\nMax mult: " << res4 << endl << endl;
 
    _getch(); // пауза чтобы посмотреть результаты работы программы
    return 0;
}
 
template <typename T>
void print(const T* arr, const size_t size)
{
    for (size_t i=0; i < size; i++)
        cout << arr[i] << ' ';
    cout << endl;
}
 
template <typename T>
T sum(const T* arr, const size_t size)
{
    T s = 0; // сумма элементов
    for (size_t i=0; i < size; i++)
        s += arr[i];
 
    return s;
}
 
template <typename T>
T maxMult(const T* arr, const size_t size)
{
    if (size == 1) // если размер равен 1 (на всякий случай)
        return arr[0];
 
    T max = arr[0] * arr[1]; // устанавливаем начальное макс. произведение
    for (size_t i=2; i < size; i++)
    {
        T mult = arr[i] * arr[i-1]; // перемножаем соседние элементы
        if (max < mult)             // если текущее произведение больше,
            max = mult;             // то макс. значение равно ему
    }
 
    return max;
}
 
// сумма и максимальное произведение
template <typename T>
void sumAndMaxMult(const T* arr, const size_t size, T& res1, T& res2)
{
    if (size == 1) // если размер равен 1 (на всякий случай)
    {
        res1 = arr[0];
        res2 = arr[0];
        return;
    }
    // задаем начальные значения результатам
    res1 = arr[0] + arr[1];
    res2 = arr[0] * arr[1];
 
    for (size_t i=2; i < size; i++)
    {
        res1 += arr[i];             // суммируем элементы
        T mult = arr[i] * arr[i-1]; // перемножаем соседние элементы
        if (res2 < mult)            // если текущее произведение больше,
            res2 = mult;            // то макс. значение равно ему
    }
}
1
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
09.06.2013, 22:50  [ТС] #9
instantiated from here (ошибка)
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.06.2013, 22:56 #10
подробный лог - это значит все, что вы увидете в output-е
у вас там может пишется что в коде шаблона ошибка такая-то потому что так и эдак и в самом конце самое неинтересное: шаблон вот тут инстанцируется.
вон например хотябы что-то такое:
test.cpp(18): error C3892: 'p' : you cannot assign to a variable that is const
test.cpp(30) : see reference to function template instantiation 'void print<int>(const T &)' being compiled
1> with
1> [
1> T=int
1> ]
Добавлено через 2 минуты
скорее всего проблема у вас внутри функции. и если вы напишите обычную точно такую же функцию, только вместо T везде int напишите - то увидите что у вас там внутри функции проблемы.
1
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
09.06.2013, 22:57  [ТС] #11
C:\Users\Desktop\2.cpp In function `void print(const T&) [with T = int]':
25 C:\Users\Desktop\2.cpp instantiated from here
13 C:\Users\Desktop\2.cpp assignment of read-only location
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.06.2013, 23:00 #12
ну то же самое что и я прислал. только другими словами.
присваивание констаной переменной. а это нельзя:
C++
1
   p[i] = p[i] << 1
если p указывает на константу (а у вас это так: const unsigned *p), то
запись p[i] = ... - это попытка ее изменить. компилятор такое не позволяет делать.

еще раз: перепишите функцию так, чтобы она была не шаблонной, а просто константную ссылку на инт принимала. после этого по проще должно быть.
1
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
09.06.2013, 23:16  [ТС] #13
я бы так и делал, но к сожалению шаблон должен быть по условию
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.06.2013, 23:35 #14
к сожалению вы так и не поняли что написать правильно функцию сперва для простых интов и потом уже ее переделать в шаблон - это проще. с обычными функциями ошибки компиляции понятнее. и сейчас у вас ошибки не из-за того, что функция шаблонная, а просто код функции кривой. но шаблоны в носят непонятки в описания ошибок.
1
mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
10.06.2013, 00:05  [ТС] #15
ну, вот если сделать просто функция без шаблонов, явного преоброзования и sizeof всё работает, с шаблонами и преобразованием, но вот sizeof всё портит
0
10.06.2013, 00:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2013, 00:05
Привет! Вот еще темы с ответами:

Перегрузка шаблона функции - C++
Здравствуйте! Помогите, пожалуйста, с реализацией задачи: &quot;Перегрузить шаблон функции для нахождения максимального и минимального значений...

Вызов функции в возврате значения функции - C++
Есть функция: int function1(a) { ...... return function2(function1(b),function1(c)); } Как работает такая хитрая система?

Вызов функции в параметре другой функции - C++
программа: #include &lt;iostream&gt; using namespace std; struct E { E() {} }; void f(const E&amp; e)

Частичная специализация шаблона функции - C++
Добрый день, помогите разобраться в чем проблема кода: template &lt;int X, int Y&gt; bool isSimple(){ return X%Y == 0 &amp;&amp;...


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

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

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