Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 16.10.2019
Сообщений: 80

Как вызывать шаблонную функцию из разных файлов

25.09.2020, 21:06. Показов 2023. Ответов 5

Студворк — интернет-сервис помощи студентам
У меня есть несколько .cpp файлов с одноименными функциями внутри них, и в двух из них(task1.cpp и task4.cpp) мне требуется вызвать одну и ту же функцию(сортировка). Только типы данных, по которым проводит сортировку функция, должны отличаться.
Я думал что можно сделать это через шаблоны, написать код сортировки в одном .cpp файле и объявить функцию во втором, но код не компилится.

task1.cpp:
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
#include <string>
#include <fstream>
#include <iostream>
#include <vector>
#include <forward_list>
 
template <typename T>
void printVec(std::vector<T>& vec)//std::vector<T>::const_iterator
{
  //код
}
 
template <typename T>
void printList(std::forward_list<T>& list)
{
  //код
}
 
template <typename T>
std::vector<T> sort1(std::string trend, std::vector<T>& vec)//bubble sort
{
  //код
}
 
template <typename T>
std::vector<T> sort2(std::string trend, std::vector<T>& vec)
{
  //код
}
 
template <typename T>
std::forward_list<T> sort3(std::string trend, std::forward_list<T>& list)
{
  //код
}
 
void task1(std::string trend, const char* fileName)//./lab1 1 ascending data1.txt [4]
{
  std::string fN = fileName;
  std::fstream file(fN);
  if (!file.is_open())
  {
    throw std::invalid_argument("File <" + fN + "> is not open");
  }
 
  std::vector<int> numbersVec1;
  int number;
  
  while (!file.eof()) 
  {
    file >> number;
    std::cout << number << ' ';
    numbersVec1.push_back(number);
  }
  std::cout << '\n';
  
  std::vector<int> numbersVec2(numbersVec1.begin(), numbersVec1.end());
  std::forward_list<int> numbersList(numbersVec1.begin(), numbersVec1.end());
 
  sort1(trend, numbersVec1);
  sort2(trend, numbersVec2);
  sort3(trend, numbersList);
 
  printVec(numbersVec1);
  printVec(numbersVec2);
  printList(numbersList);
 
  file.close();
}

task4.cpp
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
#include <string>
#include <vector>
#include <iostream>
 
const double dMin = -1.0;
const double dMax = 1.0;
 
template <typename T>
void printVec(std::vector<T>& vec);
 
template <typename T>
std::vector<T> sort1(std::string trend, std::vector<T>& vec);
 
void fillRandom(double* array, int size)
{
  for (size_t i = 0; i < size; ++i)
  {
    double f = (double)rand() / RAND_MAX;
    double number = dMin + f * (dMax - dMin);
    array[i] = round(number * 100) / 100;;
  }
}
 
void task4(std::string trend, const size_t size)
{
  if (size < 0)
  {
    throw std::invalid_argument("Size must be positive");
  }
  std::vector<double> vec(size);
  fillRandom(vec.data(), vec.size());
  printVec(vec);
  sort1(trend, vec);
  printVec(vec);
}
При компиляции выдает подобные ошибки
Миниатюры
Как вызывать шаблонную функцию из разных файлов  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.09.2020, 21:06
Ответы с готовыми решениями:

Как построить шаблонную функцию?
Добрый вечер! Есть код, который всегда повторяется в дочерних классах: QPushButton *button = new QPushButton(QIcon(&quot;:/icons/&quot;...

Как реализовать шаблонную функцию?
Добрый день Хочу реализовать одну функцию получающую значение типа int Есть два варианта получения значения, один при чтении из файла,...

Как вызывать функции из разных мест?
Как вызывать функции, написанные в разных местах. Например, есть две функции a, b. Функция a видит b, b не видит a. Если поменять их...

5
0 / 0 / 0
Регистрация: 16.10.2019
Сообщений: 80
25.09.2020, 21:13  [ТС]
Также при создании всех шаблонных функций через заголовочный файл и удалении их объявления из cpp-шек, опять выдает ошибку: множественное объявление, хотя объявлены они только в hpp файле
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
25.09.2020, 21:17
Цитата Сообщение от eogenio777 Посмотреть сообщение
Также при создании всех шаблонных функций через заголовочный файл и удалении их объявления из cpp-шек, опять выдает ошибку: множественное объявление, хотя объявлены они только в hpp файле
реализацию шаблонных функций нельзя делать в отдельном cpp-файле. Перенеси её, реализацию, в h-файл
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
25.09.2020, 21:19
Цитата Сообщение от eogenio777 Посмотреть сообщение
при создании всех шаблонных функций через заголовочный файл и удалении их объявления из cpp-шек
Это верно, так и надо делать.

Цитата Сообщение от eogenio777 Посмотреть сообщение
опять выдает ошибку: множественное объявление
Именно этот вариант кода и эти ошибки и надо показывать, это здесь вам подскажут как исправить, остальное заведомо неверно.
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
25.09.2020, 21:19
Шаблоны пишутся в хедерах что конечно сбивает с толку, но как есть ...
1
0 / 0 / 0
Регистрация: 16.10.2019
Сообщений: 80
25.09.2020, 21:24  [ТС]
Всем благодарен, со всем разобрался: множественное определение - оно и есть множественное определение
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.09.2020, 21:24
Помогаю со студенческими работами здесь

Как правильно написать шаблонную функцию?
Как правильно написать функцию template ? в функции main не работает #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using...

Не могу придумать как создать шаблонную функцию
Здравствуйте. На данный момент в моем коде есть 3 практически одинаковых метода, которые я хотел бы объединить в один шаблонный метод. Я не...

Как можно вызывать один класс в разных activity?
Всем привет! Пишу плеер типа ютюба и нужно, чтобы один класс вызывался в нескольких активти. я думаю нет смысла писать код плеера в каждой...

Как использовать шаблонную функцию в другой единице трансляции?
Как исправить ошибку? Спрашиваем у однокурсников и никто не знает(( file1.cpp export template&lt;typename T&gt; T twice(T...

Как вернуть экземпляр класса через шаблонную функцию
Вот программа, два класса и функция main #pragma once class BaseClass { public: BaseClass(); ~BaseClass();


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru