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

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

Войти
Регистрация
Восстановить пароль
 
VisualNIK
8 / 8 / 1
Регистрация: 29.10.2012
Сообщений: 168
#1

Возможно ли шаблонную функцию продекларировать в заголовочном файле - C++

18.03.2014, 13:42. Просмотров 448. Ответов 9
Метки нет (Все метки)

Возможно ли шаблонную функцию продекларировать в заголовочном файле .h??? Если да, то как это сделать??? Спасибо! Буду признателен

Например вот есть фукцния:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <class T1 , class T2> bool go_up_sequence(T1 *M, T2 s)
{
    bool flag = false;
    
    if(M[0] < M[1])
    {
        flag = true;
 
        for(int k = 2; k < s; k++)
        {
            if(M[k-1] >= M[k])
            {
                flag = false;
                break;
            }
        }
    }
 
    return flag;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2014, 13:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возможно ли шаблонную функцию продекларировать в заголовочном файле (C++):

Описать шаблонную функцию в cpp-файле - C++
файл h template &lt; class T &gt; class B_tree { private: struct T_node { friend class B_tree; T val;

Передача указателя на шаблонную функцию в другую функцию - C++
Пишу тест для нескольких улучшений квиксорта с измерением времени. Функция benchmark принимает итераторы для диапазона элементов, указатель...

Функции в заголовочном файле - C++
Почему нельза задать тело функции в .h файле??? например(header.h): #ifndef HEADER_H #define HEADER_H void f(){} #endif //...

Структура в заголовочном файле - C++
Код .h: // file.h #pragma once struct Worker { char name; int cdate; int vdate; char post;

Setlocale в заголовочном файле - C++
main.cpp #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;string&gt; #include &quot;studio.h&quot; using namespace...

Переменная в заголовочном файле - C++
//qwer.h class qwer { public: extern int a; }; //qwer.cpp #include &quot;qwer.h&quot;

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
dimcoder
Полярный
462 / 434 / 68
Регистрация: 11.09.2011
Сообщений: 1,134
18.03.2014, 13:49 #2
nvdrossii, а почему нет? Продекларировать так же как и любую функцию, потом заинклудить в cpp файл и будет все летать.
0
VisualNIK
8 / 8 / 1
Регистрация: 29.10.2012
Сообщений: 168
18.03.2014, 13:56  [ТС] #3
dimcoder, а как это сделать конкретно в этом примере? функцию декларирую просто
C++
1
int reverse_number(int num)
например. В моем случае с шаблонной ф. вставляю весь заголовок пишет ошибку о ссылке на неразрешенный символ, пробую оставлять только
C++
1
bool go_up_sequence(int *M, int s)
как видно с указанием конкретных типов уже...таже ошибка...помоему
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
18.03.2014, 14:01 #4
nvdrossii,
1. На всякий: экспорт шаблонов не поддерживается - и объявление и определение должны быть в одном файле.
2. Конкретные типы? См синтаксис специализации шаблона. А если уж пишете шаблон, то точно уверены, что вам нужно явно специализировать его?
0
VisualNIK
8 / 8 / 1
Регистрация: 29.10.2012
Сообщений: 168
18.03.2014, 16:47  [ТС] #5
0x10, воооот, это уже вариант, я тоже к этому склонялся и подозрение падало на то, что, в них в отличие от функций переменные типа классов T1,T2, объявленных так же ранее...по сути кто знает что там за классы?? в отличии от типов int, string и других типов, которые согласуются с любой точки программы...я правильно понял?

Добавлено через 2 часа 42 минуты
0x10, я хотел продекларировать в h файле эту функцию, так как она используется двумя другими, которые посылают в нее разного типа две матрицы, одна - int, другая - float. мне показалось, что использовать перегрузку нет необходимости, так как тело функции для обоих матриц одинаково, вот решил сделать шаблонную функцию, которой по барабану какого типа там пришли значения (по крайней мере в моём случае), но: так как не сработало декларирование в h файле, приходится к cpp, чьи функции используют эти шаблоны, подкрепить cpp собственно с этой шаблонной функцией...
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
18.03.2014, 16:52 #6
Много слов, мало кода... Проблемы-то остались?
Шаблоны можно спокойно писать полностью в заголовочном файле.
1
VisualNIK
8 / 8 / 1
Регистрация: 29.10.2012
Сообщений: 168
18.03.2014, 17:25  [ТС] #7
0x10, да нет проблеммы нету сейчас, просто cpp файл с ними подцепляю куда нужно, да про заголовочный до этого ещё просек, но потом обратил внимание на то, что в заголовочных обычно только прототипы функций пишут, а реализацию в cpp. Мол так и задуманно и прочее и прочее. вот и решил потыркаться, если так можно выразиться...рабочие варианты моей глобальной задачи были изначально,
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,093
18.03.2014, 20:04 #8
Цитата Сообщение от nvdrossii Посмотреть сообщение
в них в отличие от функций переменные типа классов T1,T2, объявленных так же ранее...по сути кто знает что там за классы?? в отличии от типов int, string и других типов, которые согласуются с любой точки программы...я правильно понял?
Ну почти. Вся соль в том, что тело шаблона должно быть доступно в точке, где подставляются реальные типы (это называется инстанцирование). Файлы в С++ компилируются отдельно, и файл а.cpp не знает что находится в b.cpp на этапе компиляции. Поэтому тело шаблона помещенное в один cpp не может быть "распознано" при использовании в другом cpp. Отсюда рекомендация писать шаблоны в заголовочных файлах.
Раньше была еще такая фича - экспорт шаблонов. За все время ее существования в стандарте языка, ее умудрились реализовать только ребята из Comeau Computing, да и то на базе наработок EDG (их компилятор до недавнего времени был известен как один из наиболее полно соответствующих стандарту). В общем суть этой фичи заключалась в том, что генерились специальный файлы, в которых содержалась необходимая информация о таких шаблонах.
Однако на сегодняшний момент, эта возможность исключена из стандарта вследствие своей невостребованности пользователями и сложности реализации в компиляторе.
1
VisualNIK
8 / 8 / 1
Регистрация: 29.10.2012
Сообщений: 168
19.03.2014, 07:17  [ТС] #9
Цитата Сообщение от DrOffset Посмотреть сообщение
Отсюда рекомендация писать шаблоны в заголовочных файлах.
ну вот благодарю! хотя и любую информацию требуется проверять, это уже конкретика...хорошие книги прочитать время пока нету просто, но все ж ответы на вопросы ищу и кое-что хоть и так находится, спасибо! значит я правильно делал, когда пихал их в заголовочный файл...
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,093
19.03.2014, 17:53 #10
Цитата Сообщение от nvdrossii Посмотреть сообщение
хотя и любую информацию требуется проверять
Очень советую информацию проверять в стандарте Я бы мог конечно сразу тебя туда послать, но мне показалось, что в этой ситуации лучше объяснить.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2014, 17:53
Привет! Вот еще темы с ответами:

Не подключается namespace в заголовочном файле - C++
Всем доброго дня. Ситуация такая: common.h #pragma once namespace CommonSystem { class Device {

Создание структуры в заголовочном файле - C++
Доброго времени суток! Решил заняться разработкой приложений, сейчас делаю небольшую программу, библиотека SFML. Вопрос: Я создал...

Объявление константы в заголовочном файле - C++
Как объявить константу и массив в заголовочном файле? Map.h #pragma once #include &lt;SFML\Graphics.hpp&gt; extern const...

Объявление класса в заголовочном файле - C++
Здравствуйте. Столкнулся с тем что нужно скомпилировать библиотеку для C++. классы написал, библиотеку скомпилировал. осталось только...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.03.2014, 17:53
Ответ Создать тему
Опции темы

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