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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.96
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
#1

Шаблоны - C++

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

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

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». - C++
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если есть, то в чём? И где (в каких...

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

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

Шаблоны C++ - C++
Написал template на С++, но он нифига не компилица, пишет мол типа не могу string в int преобразовать в строчке int out_param = (int)param;...

Шаблоны - C++
Я разбираюсь с ООП в С++ и застрял на шаблонах, будьте добры приведите пример кода, к примеру там.... вес машины и шаблон,(ну вообщем на...

Шаблоны - C++
// ConsoleApplication176.cpp : Defines the entry point for the console application. // template<class type> struct link { type...

28
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.02.2010, 12:52 #2
Нужно. Но в cpp включи h инкладом, а в проект - только cpp.
0
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 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
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.02.2010, 12:59 #4
fasked, по идее - можно. А на самом деле большинство компиляторов не поддерживают раздельную компиляцию шаблонов.
1
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
24.02.2010, 13:01  [ТС] #5
Но если включать *.cpp смысл заголовочного файла вообще пропадает...
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.02.2010, 13:14 #6
Цитата Сообщение от taras atavin Посмотреть сообщение
Нужно. Но в cpp включи h инкладом, а в проект - только cpp.
*.cpp файлы вообще никогда ни к чему не надо подключать.
0
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 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
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
01.03.2010, 07:06 #8
Точно не знаю, но по идее должны. И шаблоны не работают вообще ни с чем, пока их не специализируешь. После шаблона пропиши, по одно строке на каждый, классы со всеми базовыми типами от этого шаблона.
0
Genius Ignat
1236 / 774 / 44
Регистрация: 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
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 10:25 #11
fasked:
Ни какой комерции и сокрытия кода.
Просто это главная цель любого проекта, сколь успешного проекта.

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

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

МоCyBOSSeR
Может эта инфа устарела...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2010, 10:39
Привет! Вот еще темы с ответами:

Шаблоны - C++
ругается на строку &quot;friend class List&lt;T&gt;;&quot;, вот что пишет: 1&gt;c:\users\slava\documents\visual studio...

Шаблоны С++ - C++
template &lt;typename T_sizeCapacity&gt; class SomeClass { public: T_sizeCacity size; }; Как сделать чтобы T_sizeCapacity мог быть...

Шаблоны - C++
Не пойму что я неправильно делаю. Как не переделывал, всё равно не получалось. Может кто сможет чем помочь. А задача следующая-надо было...

Шаблоны C++11 - C++
#include &lt;iostream&gt; template&lt;typename T1, typename T2&gt; auto func(T1 a, T2 b) -&gt; decltype(a&gt;b?b:a) { return a&gt;b?b:a; ...


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

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

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