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

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

Войти
Регистрация
Восстановить пароль
 
aas_
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 7
#1

Глупый вопрос по шаблонам - C++

26.10.2011, 13:37. Просмотров 586. Ответов 6
Метки нет (Все метки)

Доброе время суток!

Я достаточно опытный программист Java, но жизнь, как говорится, заставила переквалифицироваться на C++, причем, очень срочно. Давным давно был у меня опыт написания на C++ и MFC, но я не вникал тогда глубоко.

Собственно вопрос:
Пишут, что, в отличие от Java, в C++ создается откомпилированный экземпляр функции или класса для каждого значения параметров шаблона. Очевидно, предугадать заранее все возможные значения невозможно. А если я описываю само тело шаблонной функции в одном файле, а вызываю из другого, причем, на этапе компиляции второго файла у меня нет исходников первого файла, есть только объектный файл. Откуда линковщик (или компилятор?) берет исходную информацию для генерации этой функции с конкретно моим значением параметра? И куда он пишет результат генерации этой функции?

Спасибо за ответы!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2011, 13:37     Глупый вопрос по шаблонам
Посмотрите здесь:

вопрос по шаблонам - C++
начал разбираться в шаблонах и что то не получается вот код без шаблона все работает #include<iostream> #include<string> ...

Оч глупый вопрос - C++
вот вместо цифры 1 как поставить переменную p->Bitmap->SaveToFile("C:\\bm\\rf\\1.bmp"); до этого баловался только с борландом.. поэтому...

простой и глупый вопрос - C++
Да, вопрос немного глуповат, но в нете так ничего и не нашла. Либо просто вводила не то для поиска. Не знаю короче. Суть вопроса: У меня...

Глупый вопрос по указателям? - C++
Здравствуйте! Подскажите как это работает? Правильно ли я понимаю? struct A { }; struct B: public A { int var1; ...

Извините за глупый вопрос. - C++
Как в С++ записывается "и"? (Например в Pascal это "and"). И как записать это в условие типа: if (N<1000) "и" (N>100) { bla bla bla...

Глупый вопрос (возведение в квадрат) - C++
Всем привет. Почему то не работает следующая элементарныя строчка кода. Значения y получаются отрицательными, например около -30000, хотя...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rampagery
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 6
26.10.2011, 14:01     Глупый вопрос по шаблонам #2
Компилятор сам находит описание класса(ну или шаблона классов)необходимо лиш подключить файл
C++
1
#include "FileName.h"
компилятор сам найдет файл .cpp
оно создает в стеке копию шаблонного класа(для конкретного типа уже)
Ето довольно быстрый процес и поетому многофайловые программы есть популярны
(Кстати вы не задумывались как в большых проектах компилятор находит все описания классов из
других файлов,ведь 1-н програмист работает над 1 частицей программы а их там много.)
aas_
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 7
26.10.2011, 14:11  [ТС]     Глупый вопрос по шаблонам #3
Цитата Сообщение от Rampagery Посмотреть сообщение
Компилятор сам находит описание класса(ну или шаблона классов)необходимо лиш подключить файл
C++
1
#include "FileName.h"
компилятор сам найдет файл .cpp
оно создает в стеке копию шаблонного класа(для конкретного типа уже)
Ето довольно быстрый процес и поетому многофайловые программы есть популярны
(Кстати вы не задумывались как в большых проектах компилятор находит все описания классов из
других файлов,ведь 1-н програмист работает над 1 частицей программы а их там много.)
То есть я не могу, получается, использовать шаблон, если не имею его исходника (cpp-файла), а есть только заголовочный файл и откомпилированный исходник (или вообще библиотека)? А как же разные внешние библиотеки вроде STL, они разве с исходниками приходят? А коммерческие шаблоны, где исходники закрыты, разве невозможны? Для нешаблонных функций и классов достаточно было всегда, насколько я помню, только заголовочника и откомпилированного модуля.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
26.10.2011, 14:16     Глупый вопрос по шаблонам #4
aas_, шаблоны нельзя разносить на файлы реализации и файлы заголовков
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
26.10.2011, 14:18     Глупый вопрос по шаблонам #5
Шаблонные функции/классы нельзя описывать в разных файлах. Только в .hpp. Для примера посмотрите boost.

Возможно только так вообщем-то.

C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef __SOME_H__
#define __SOME_H__
 
template<class T>
class Some
{
public:
   void some();
};
 
#endif
C++
1
2
3
4
5
6
7
8
9
#include "some.hpp"
 
template<class T>
void Some<T>::some()
{
}
 
template class Some<int>;
template class Some<double>;
C++
1
2
3
4
5
6
7
8
9
#include "some.hpp"
 
int main()
{
    Some<int> sm;
    sm.some();
    Some<float> other_sm;
    other_sm.some(); //Ошибка линковки.
}
aas_
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 7
27.10.2011, 11:21  [ТС]     Глупый вопрос по шаблонам #6
Ясно, спасибо!

Добавлено через 21 час 0 минут
Я посмотрел реализацию шаблонов STL в GNU ARM, там сам код в файле ".tcc" и инклудится в .h-файл через #ifndef константы, которая будет раскомментирована, когда они сделают экспорт шаблонов .

Но остался вопрос: если в код каждого модуля пихают код для каждого шаблона каждого типа, который используется, и в двух файлах получится 2 копии одной функции в результате (один шаблон и один набор параметров), линковщик это проглотит? И сколько копий в исполняекмом файле будет? Или они компилируются так, чтобы наружу файла не видны были?

Спасибо за ответы!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2011, 15:20     Глупый вопрос по шаблонам
Еще ссылки по теме:

Глупый вопрос про наследование - C++
Вот фрагмент кода, реального: class CListviewParamPrimary : public CListviewParamFloats { private: /** * @brief Возвращает...

Глупый вопрос по считыванию символов с клавиатуры - C++
заранее извиняюсь за глупый вопрос, но ответ на него отгуглить не смог: n = getche не считывает нажатия на enter, но считывает пробелы...

Стек, связный список и глупый вопрос - C++
Содержание stack.h #include &lt;cstddef&gt; // Определение константы NULL template &lt;typename T&gt; class Stack { public: Stack(); ...

Глупый вопрос по типу данных Variant - C++
Обнаружил, что не очень четко понимаю что он из себя представляет и при его использовании возникает пачка вопросов. Может быть...


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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
27.10.2011, 15:20     Глупый вопрос по шаблонам #7
Цитата Сообщение от Rampagery Посмотреть сообщение
компилятор сам найдет файл .cpp
компилятор сам ничего не найдет, компилятору нужно указывать, какие файлы нужно компилировать и что с чем линковать. Другое дело, что в современных IDE это зачастую происходит прозрачно от программиста
Yandex
Объявления
27.10.2011, 15:20     Глупый вопрос по шаблонам
Ответ Создать тему
Опции темы

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