Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
#1

Шаблоны

24.02.2010, 12:49. Просмотров 3184. Ответов 28

Когда разделяю реализацию и прототип шаблонной в функции по разным файлам (*.h и *.cpp) происходит ошибка линковки... Я так понимаю, делать так нельзя?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2010, 12:49
Ответы с готовыми решениями:

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами».
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в...

Шаблоны. Плохо понимаемые моменты из книги "Шаблоны С++. Справочник разработчика". (Вандевурд, Джосаттис)
Так как изучаю эту книгу, то в некоторых местах возникают вопросы. Чтобы не...

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны
В одномерном массиве, состоящем из п вещественных элементов, вычислить: 1)...

Шаблоны
Здравствуйте, подскажите пожалуйста почему компилятор мне пишет, что...

Шаблоны
На сколько я знаю, в с++ нельзя указать типу шаблона что то вроде: <T extends...

28
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
24.02.2010, 12:52 #2
Нужно. Но в cpp включи h инкладом, а в проект - только cpp.
0
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.02.2010, 12:58  [ТС] #3
То есть получается вот так?

*.h
C++
1
template <typename array> void print(array * a, size_t size);

*.cpp
C++
1
2
3
4
5
6
7
#include "sort.h"
template <typename array> void print(array * a, size_t size)
{
    while(size--)
        std::cout << *a++ << " ";
    std::cout << std::endl;
}

main.cpp
C++
1
2
3
4
5
6
7
8
#include <iostream>
#include "sort.cpp"
int main() 
{
    const int size = 4;
    int a[size] = { 1, 2, 3, 4 };
    print(a, size);
}
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
24.02.2010, 12:59 #4
fasked, по идее - можно. А на самом деле большинство компиляторов не поддерживают раздельную компиляцию шаблонов.
1
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.02.2010, 13:01  [ТС] #5
Но если включать *.cpp смысл заголовочного файла вообще пропадает...
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
24.02.2010, 13:14 #6
Цитата Сообщение от taras atavin Посмотреть сообщение
Нужно. Но в cpp включи h инкладом, а в проект - только cpp.
*.cpp файлы вообще никогда ни к чему не надо подключать.
0
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
01.03.2010, 03:29  [ТС] #7
Еще один вопрос по шаблонам.
При перегрузка оператора <<
C++
1
friend std::ostream &operator << (std::ostream &out, BaseMatrix<T> &m);
Возникает ошибка ''undefined reference''

Исправляю прототип на следующий
C++
1
friend std::ostream &operator << (std::ostream &out, BaseMatrix<int> &m);
И ошибка соответственно пропадает, то есть как я понимаю необходимо для каждого типа описать собственную функцию? Шаблоны плохо работают с потоками?
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
01.03.2010, 07:06 #8
Точно не знаю, но по идее должны. И шаблоны не работают вообще ни с чем, пока их не специализируешь. После шаблона пропиши, по одно строке на каждый, классы со всеми базовыми типами от этого шаблона.
0
Genius Ignat
1241 / 779 / 108
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 10:11 #9
Когда разделяю реализацию и прототип шаблонной в функции по разным файлам (*.h и *.cpp) происходит ошибка линковки... Я так понимаю, делать так нельзя?

Не получится компоновщик будет придераться к компилятору: что он(компилятор)
не смог сделать интацирование.

Посмотри заголовки из STL, сплошной отркрытый код.
Ни какой комерции и сокрытия кода с шабонами может не получится.
0
fasked
01.03.2010, 10:20  [ТС]
  #10

Не по теме:

Цитата Сообщение от Genius Ignat Посмотреть сообщение
Ни какой комерции и сокрытия кода
Та при чем здесь это, просто привычка оО

0
Genius Ignat
1241 / 779 / 108
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 10:25 #11
fasked:
Ни какой комерции и сокрытия кода.
Просто это главная цель любого проекта, сколь успешного проекта.

//-----------------------------------------------------
Когда ты разбиваешь на. h и на .cpp
Файл .cpp можно представить и без исходного кода:
просто библиотекой .lib или dll библиотекой.
Это и есть сокрытие реализации.
//-----------------------------------------------------
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
01.03.2010, 10:27 #12
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Ни какой комерции и сокрытия кода с шабонами может не получится.
Очень даже получиться. Никто не мешает создать обертки (wrapper) для конкретных классов-шаблонов.
0
Genius Ignat
1241 / 779 / 108
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 10:28 #13
Исправлюсь.
[QUOTE=Genius Ignat;574433]fasked:
Ни какой комерции и сокрытия кода.
Сокрытие реализации:
Просто это главная цель любого проекта, сколь успешного проекта.
0
Evg
Эксперт CАвтор FAQ
19277 / 7134 / 528
Регистрация: 30.03.2009
Сообщений: 19,976
Записей в блоге: 30
01.03.2010, 10:30 #14
fasked, реализацию шаблонов обычно пишут в файлах *.h. Шаблон по своей сути чем-то напоминает директиву #define - если былы использование шаблона, то код сгенерится, если не было - не сгенерится. Если ты делаешь подстановку (инстанциацию) шаблона в двух разных *.cpp файлах, то код фактически сгенерится дважды. Но ошибки на линковке не будет, т.к. компилятор шаблонный код генерит таким образом, что линкер это понимает и из всех одинаковых реализаций оставляет только одну. Это, кстати говоря, одно из мест, из-за которых компиляция на Си++ требует бОльшего времени, чем на Си (недавно обсуждалось в одной из тем)
1
Genius Ignat
1241 / 779 / 108
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 10:39 #15
обертки (wrapper)
Обёртки, ну и название, лучше тогда оболочки.

Я слышал что в бинарик шаблоны можно закакатать так:
только явно истацированные версии, функций.
То есть заранее известный набор функций для определённых типов.
Надо использовать директивы явного инстацирования.

МоCyBOSSeR
Может эта инфа устарела...
0
Evg
Эксперт CАвтор FAQ
19277 / 7134 / 528
Регистрация: 30.03.2009
Сообщений: 19,976
Записей в блоге: 30
01.03.2010, 12:39 #16
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Надо использовать директивы явного инстацирования
"Мужик, кончай умничать, покажи пальцем, в какую сторону плыть" (c)
0
Genius Ignat
1241 / 779 / 108
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 12:40 #17
Evg:
Я не умничаю, короче пишите в заголовках и все OK.
0
Evg
Эксперт CАвтор FAQ
19277 / 7134 / 528
Регистрация: 30.03.2009
Сообщений: 19,976
Записей в блоге: 30
01.03.2010, 12:44 #18
Genius Ignat, я имел в виду покажи конкретный пример, а не слова типа "Надо использовать директивы явного инстацирования", которые топикстартер, возможно, и не знает. Я, кстати, тоже не знаю
0
Genius Ignat
1241 / 779 / 108
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 12:45 #19
Меня тоже интересует этот вопрос по поводу шаблонов, но достойного внимания,
решения я не видел.

Добавлено через 36 секунд
Evg:
А тебе интересно?
0
fasked
Эксперт С++
4981 / 2560 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
01.03.2010, 12:47  [ТС] #20
Цитата Сообщение от Genius Ignat Посмотреть сообщение
А тебе интересно?
Мне интересно
0
01.03.2010, 12:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2010, 12:47

шаблоны
Помогите пож. разобраться с шаблонами. Шаблоны у которых параметры тоже...

Шаблоны
#include &lt;iostream&gt; using namespace std; template &lt;class T&gt; class Vector{...

Шаблоны
Есть два класса: #include &lt;iostream&gt; #include &lt;string&gt; #include...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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