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

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

Восстановить пароль Регистрация
 
aas_
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 7
26.10.2011, 13:37     Глупый вопрос по шаблонам #1
Доброе время суток!

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

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

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

C++ вопрос по шаблонам
Глупый вопрос по считыванию символов с клавиатуры C++
простой и глупый вопрос C++
Глупый вопрос по указателям? C++
C++ Оч глупый вопрос
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
26.10.2011, 14:16     Глупый вопрос по шаблонам #4
aas_, шаблоны нельзя разносить на файлы реализации и файлы заголовков
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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++ Глупый вопрос (возведение в квадрат)
C++ Глупый вопрос про наследование
Извините за глупый вопрос. C++

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

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

Текущее время: 18:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru