Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для IpHuman
14 / 14 / 2
Регистрация: 28.01.2015
Сообщений: 26

Ошибка вызова шаблонной функции - C++

11.10.2016, 20:06. Показов 1541. Ответов 6

Студворк — интернет-сервис помощи студентам
Читаю Прата, остановился на таком задании:
Напишите функцию с интерфейсом в старом стиле, которая имеет следующий
прототип:
int reduce(long ar[], int n) ;
Действительными аргументами должны быть имя массива и количеством
элементов в нем. Функция должна сортировать массив, удалять дублированные
значения и возвращать значение, равное числу элементов в уменьшенном массиве.
Напишите эту функцию, используя функции STL. (Если вы решите применить
общую функцию unique (), обратите внимание, что она возвращает конец
результирующего диапазона.) Протестируйте эту функцию в короткой программе.
Решите ту же задачу, что и в упражнении 4, но с помощью шаблонной функции:
template <class T>
int reduce (T ar [ ] , int n) ;
Протестируйте функцию в короткой программе, используя экземпляры с long
и string.
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
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
const int Arsize = 10;
using namespace std;
template <class T>
int reduce(T *ar, int n);
//void show(const T & l) {cout << l << " ";}
int main()
{
    long arr[Arsize];
    cout << "Enter some digits:\n";
    for (int i = 0; i < Arsize; i++)
    {
        cout << "#" << i + 1 << ": ";
        cin >> arr[i];
    }
    cout << "You entered next: ";
    for (int i = 0; i < Arsize; i++)
    {
        cout << arr[i] << " ";
    }
 
    int num = reduce(arr, Arsize);
    cout << "\nModified array has " << num << " objects!\n";
 
    string str;
    cout << "Enter some string:\n";
    getline(cin, str);
    cout << "You entered next: " << str << endl;
    int n_str = str.size();
    int num_str = reduce(str, n_str);
    cout << "\nModified string has " << num_str << " objects!\n";
    return 0;
}
template <class T>
int reduce(T *ar, int n)
{
    vector<T> lst(ar, ar+n);
    sort(lst.begin(), lst.end());
    cout << "\nSorted array: ";
    for(auto x: lst) cout << x << " ";
 
    auto last_it = unique(lst.begin(), lst.end());
    cout << "\nArray after unique: ";
    for(auto x: lst) cout << x << " ";
 
    lst.erase(last_it, lst.end());
    cout << "\nArray after erase: ";
    for(auto x: lst) cout << x << " ";
 
    int num = lst.size();
    return num;
}
Ругается компилятор на этой строке, при вызове шаблонной функции: int num_str = reduce(str, n_str);
С типом long работает нормально, если убрать часть которая составляет string.
В чем проблема, что делать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.10.2016, 20:06
Ответы с готовыми решениями:

Ошибка вызова шаблонной функции
Вообщем у меня вопрос такой: Использую MVS 2010. Пишу шаблон функции для поиска максимального из двух чисел: template &lt;class T&gt;...

Объясните синтаксис вызова шаблонной функции
Привет, сижу, читаю я такой книжку, ок да? и вижу вот это: #include &lt;iostream&gt; #include &lt;bitset&gt; #include &lt;string&gt; ...

Ошибка в шаблонной функции с переменным числом аргуметом
Всем привет. В книге &quot;Прата С. Язык программирования С++. Лекции и упражнения - 2011&quot;, есть пример такого кода: #include...

6
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
11.10.2016, 20:14
Цитата Сообщение от IpHuman Посмотреть сообщение
Действительными аргументами должны быть имя массива и количеством
элементов в нем.
Цитата Сообщение от IpHuman Посмотреть сообщение
int num_str = reduce(str, n_str);
str- это разве массив?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
11.10.2016, 20:15
Цитата Сообщение от IpHuman Посмотреть сообщение
В чем проблема
Очевидно, в том, что str - то не указатель и неявно не приводится к нему (в отличие от массива).

Цитата Сообщение от IpHuman Посмотреть сообщение
что делать?
Передать указатель.
C++
1
int num_str = reduce(str.c_str(), n_str);
Только декларацию функции сделать более корректной:
C++
1
2
template <class T>
size_t reduce(const T * ar, size_t n)
1
 Аватар для IpHuman
14 / 14 / 2
Регистрация: 28.01.2015
Сообщений: 26
11.10.2016, 20:20  [ТС]
Совсем забыл. Я еще неопытный. Спасибо за ответ.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
11.10.2016, 20:23
Цитата Сообщение от DrOffset Посмотреть сообщение
Только декларацию функции сделать более корректной:
C++
1
2
template <class T>
size_t reduce(const T * ar, size_t n)
А как же это?
Цитата Сообщение от IpHuman Посмотреть сообщение
Функция должна сортировать массив, удалять дублированные
значения
и возвращать значение, равное числу элементов в уменьшенном массиве.
Мне кажется, там массив string должен использоваться.
0
11.10.2016, 20:26

Не по теме:

Цитата Сообщение от nd2 Посмотреть сообщение
А как же это?
А мне наплевать :) Я задание не читал. Исправил ошибку компиляции и доволен.

0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
11.10.2016, 20:35
Хотя, в функции он этот указатель только для инициализации вектора использует, поэтому const не мешает.

Добавлено через 4 минуты
Цитата Сообщение от IpHuman Посмотреть сообщение
Протестируйте функцию в короткой программе, используя экземпляры с long
и string.
Но, из этой фразы, всё равно массив string вытекает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.10.2016, 20:35
Помогаю со студенческими работами здесь

Ошибка при сборке перегруженной шаблонной функции
Привет Есть перегруженная шаблонная функция с приведением типов. Перегрузка состоит в вариантах параметров: 1. передача параметров по...

Ошибка сборки при раздельной компиляции шаблонной функции
Помогите с ошибкой, никак не могу найти решение #pragma once #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;string&gt; ...

При вызове метода функционального объекта в шаблонной функции ошибка компиляции C2039
Объект класса Entry - это запись в журнале экзаменационной сессии: номер зачетки, фамилия, курс, группа, дисциплина, оценка. В задаче есть...

Оператор вызова функции объекта (Ошибка)
Добрый день, столкнулся с ошибкой. Занимаюсь по учебнику C++ Primer 4-е издание. Написал учебную программу связанную с оператором...

Ошибка при создании шаблонной функции:"error C2075: temp: для инициализации массива требуются фигурные скобки"
template &lt;typename T&gt; int GnomeSort(T* p, int length) { int i, count; i = 0; count = 0; while(i &lt; length) { if(i...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru