реклама на сайте
подробности

 
 
> template в многомодульном проекте C++, где должен быть код шаблона - в xx.CPP или xx.hpp
k155la3
сообщение Jan 11 2017, 12:22
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Проект многомодульный, и полно "перекрестных" запросов из модуля в модуль.
В классе есть функция-метод, заданная шаблоном. Этот класс предполагаетс пользовать из других модулей.

Где должно располагаться "тело" функции, в hpp-файле или в cpp ?

(как шаблон "узнает" какие "сущности-реализации" кода шаблона-функции надо генерировать,
если это все (запросы к ф-ии из других модулей) проясняется уже на уровене линкера, и "докомпилировать" уже нельзя).

Я пришел к выводу, что код надо размещать в hpp-файле, который включается во все вызывающие модули.

Это так или нет ?

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sigmaN
сообщение Jan 12 2017, 09:07
Сообщение #2


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
В .cpp можно поместить специализацию, но в заголовочном файле в этом случае должно быть указано, что такая специализация существует.

Имеется ввиду "использование" шаблона? т.е. в .cpp например объявляем переменную templClass<char> charTemplateVar;


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jan 16 2017, 10:00
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(sigmaN @ Jan 12 2017, 12:07) *
Имеется ввиду "использование" шаблона? т.е. в .cpp например объявляем переменную templClass<char> charTemplateVar;


Код
Задача - писать в архив(ы) записи различных форматов соотв-их,
например, различным событиям или лог-записям.
Автоматизация/аналог ручного использования reinterpret_cast.


--------------- Events.hpp ------------------
class CLog
{
    . . . . .

        int Put_SER_PageFlash_E( int );  метод записи для событий вида LOG

    . . . . .
};



class CEvents32
{
    . . . . .

        int Put_SER_PageFlash_E( int );   метод записи для "флаговых" событий
    
    . . . . .
};

---------------- Archive.hpp --------------------
class CArchive
{
public:

    . . . . .

    . . . . .

    . . . . .

        template <typename TPL_EventT> int PutToArchive_B( int n, TPL_EventT * obj_ptr )        
        {
              a_page = buf_base + p_WR;
              ret_45 = AT45_PageIsEmpty( a_page , 264, 1);    // Empty == 1 ?
              if( ret_45 != 1 )    
                return(-200);        
              else
              {
                    ret_45 = obj_ptr->Put_SER_PageFlash_E( a_page );
                    if( ret_45 > 0 )
                    {
                        ForwardIndex();
                        return(1);
                    }
                    else
                        return(ret_45);
              }
        }

    . . . .

    . . . .

    CArchive( int r_size )    {  . . . . . };
    ~CArchive(void)    { };
};


----------- вызовы из модулей -------------
(1) модуль 1
// тип Type(EV_Alarm32_1) ==  CEvents32
retCode_2 = ARH_Event.PutToArchive_B( 0, &EV_Alarm32_1);  пишем флаги 32 бит


(2) модуль 2
// тип Type(EV_Log_1) ==  CLog
retCodeARH = ARH_Event.PutToArchive_B( 1, &EV_Log_1 ); пишем литерал
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th August 2025 - 00:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016