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

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

Восстановить пароль Регистрация
 
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
09.06.2013, 22:03     Вызов функции (шаблона) #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
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
09.06.2013, 22:04     Вызов функции (шаблона) #2
Цитата Сообщение от mster-doc Посмотреть сообщение
int main()
{
print(const T &a);
а что вы ему хотите передать?
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
09.06.2013, 22:35  [ТС]     Вызов функции (шаблона) #3
хочу передать всё (запрос на ввод числа, и результат разложения числа на байты)
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
09.06.2013, 22:37     Вызов функции (шаблона) #4
mster-doc, наверное стоит сначала создать объект, а потом передать его функции, не?
И в main никто не знает что такое T, что такое a.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.06.2013, 22:40     Вызов функции (шаблона) #5
ваш шаблон может вызываться как любая другая функция:
C++
1
2
3
print(10);
print(10.0);
print(10u);
Возможно некоторые варианты не скомпиляться, т.к. есть у меня подозрения, что код внутри самого шаблона кривой.
mster-doc
 Аватар для 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);
В смысле создать объект? А разве заводя параметры он не создаётся?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.06.2013, 22:45     Вызов функции (шаблона) #7
какую ошибку пишет то?
если сами не понимаете, то хоть сюда запостили бы подробный лог.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
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;            // то макс. значение равно ему
    }
}
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
09.06.2013, 22:50  [ТС]     Вызов функции (шаблона) #9
instantiated from here (ошибка)
DU
1477 / 1053 / 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 напишите - то увидите что у вас там внутри функции проблемы.
mster-doc
 Аватар для 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
DU
1477 / 1053 / 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] = ... - это попытка ее изменить. компилятор такое не позволяет делать.

еще раз: перепишите функцию так, чтобы она была не шаблонной, а просто константную ссылку на инт принимала. после этого по проще должно быть.
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
09.06.2013, 23:16  [ТС]     Вызов функции (шаблона) #13
я бы так и делал, но к сожалению шаблон должен быть по условию
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.06.2013, 23:35     Вызов функции (шаблона) #14
к сожалению вы так и не поняли что написать правильно функцию сперва для простых интов и потом уже ее переделать в шаблон - это проще. с обычными функциями ошибки компиляции понятнее. и сейчас у вас ошибки не из-за того, что функция шаблонная, а просто код функции кривой. но шаблоны в носят непонятки в описания ошибок.
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
10.06.2013, 00:05  [ТС]     Вызов функции (шаблона) #15
ну, вот если сделать просто функция без шаблонов, явного преоброзования и sizeof всё работает, с шаблонами и преобразованием, но вот sizeof всё портит
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
10.06.2013, 00:07     Вызов функции (шаблона) #16
работающий код с интом покажите.
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
10.06.2013, 19:21  [ТС]     Вызов функции (шаблона) #17
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
#include <iostream>
 
using namespace std;
 
 
void print()
{  
     int a = 8;
     int b;
         cout <<"Input number:";
    cin >> b;
 
 
        for (int i = 0; i < a; i++) 
     {
         if (b & 0x80) cout << 1;
         else cout << 0;
         b=b <<1;
     }
     cout << endl;
 
}
 
 
int main()
{
    print();
 
    
    system("pause");
    return 0;
}
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
10.06.2013, 23:45     Вызов функции (шаблона) #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
28
29
30
31
32
33
#include <iostream>
 
template <typename T>
void print(const T& obj)
{
  typedef unsigned char Byte;
  const Byte* objData = reinterpret_cast<const Byte*>(&obj);
  for (int i = sizeof(T) - 1; i >= 0; --i)
  {
    const Byte data = objData[i];
    Byte mask = 0x80;
    for (int j = 0; j < 8; ++j)
    {
      std::cout << ((data & mask) ? 1 : 0);
      mask >>= 1;
    }
    std::cout << ' ';
  }
  std::cout << std::endl;
}
 
int main()
{
  print(0xf0);
  print(0xf0ull);
  print(char(0xf0));
  print(short(0xf0));
  print(true);
  print(10.2);
 
  system("pause");
  return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2013, 00:50     Вызов функции (шаблона)
Еще ссылки по теме:

Перегрузка шаблона функции C++
Создание шаблона функции C++
Вызов функции в параметре другой функции C++

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

Или воспользуйтесь поиском по форуму:
mster-doc
 Аватар для mster-doc
14 / 14 / 4
Регистрация: 10.11.2012
Сообщений: 239
11.06.2013, 00:50  [ТС]     Вызов функции (шаблона) #19
Гигантское тебе спасибо, ты не мог бы теперь помочь мне разобраться и понять что тут написано?
вот например 7 строка
Yandex
Объявления
11.06.2013, 00:50     Вызов функции (шаблона)
Ответ Создать тему
Опции темы

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