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

Шаблоны - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.96
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
24.02.2010, 12:49     Шаблоны #1
Когда разделяю реализацию и прототип шаблонной в функции по разным файлам (*.h и *.cpp) происходит ошибка линковки... Я так понимаю, делать так нельзя?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2010, 12:49     Шаблоны
Посмотрите здесь:

Шаблоны в C++ C++
C++ Шаблоны C++
C++ Шаблоны
Шаблоны C++
C++ Шаблоны C++11
Шаблоны С++ C++
Шаблоны C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.02.2010, 12:52     Шаблоны #2
Нужно. Но в cpp включи h инкладом, а в проект - только cpp.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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);
}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.02.2010, 12:59     Шаблоны #4
fasked, по идее - можно. А на самом деле большинство компиляторов не поддерживают раздельную компиляцию шаблонов.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
24.02.2010, 13:01  [ТС]     Шаблоны #5
Но если включать *.cpp смысл заголовочного файла вообще пропадает...
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
24.02.2010, 13:14     Шаблоны #6
Цитата Сообщение от taras atavin Посмотреть сообщение
Нужно. Но в cpp включи h инкладом, а в проект - только cpp.
*.cpp файлы вообще никогда ни к чему не надо подключать.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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);
И ошибка соответственно пропадает, то есть как я понимаю необходимо для каждого типа описать собственную функцию? Шаблоны плохо работают с потоками?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
01.03.2010, 07:06     Шаблоны #8
Точно не знаю, но по идее должны. И шаблоны не работают вообще ни с чем, пока их не специализируешь. После шаблона пропиши, по одно строке на каждый, классы со всеми базовыми типами от этого шаблона.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 10:11     Шаблоны #9
Когда разделяю реализацию и прототип шаблонной в функции по разным файлам (*.h и *.cpp) происходит ошибка линковки... Я так понимаю, делать так нельзя?

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

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

Не по теме:

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

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

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

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

МоCyBOSSeR
Может эта инфа устарела...
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16936 / 5341 / 328
Регистрация: 30.03.2009
Сообщений: 14,357
Записей в блоге: 26
01.03.2010, 12:39     Шаблоны #16
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Надо использовать директивы явного инстацирования
"Мужик, кончай умничать, покажи пальцем, в какую сторону плыть" (c)
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 12:40     Шаблоны #17
Evg:
Я не умничаю, короче пишите в заголовках и все OK.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16936 / 5341 / 328
Регистрация: 30.03.2009
Сообщений: 14,357
Записей в блоге: 26
01.03.2010, 12:44     Шаблоны #18
Genius Ignat, я имел в виду покажи конкретный пример, а не слова типа "Надо использовать директивы явного инстацирования", которые топикстартер, возможно, и не знает. Я, кстати, тоже не знаю
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 12:45     Шаблоны #19
Меня тоже интересует этот вопрос по поводу шаблонов, но достойного внимания,
решения я не видел.

Добавлено через 36 секунд
Evg:
А тебе интересно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2010, 12:47     Шаблоны
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
01.03.2010, 12:47  [ТС]     Шаблоны #20
Цитата Сообщение от Genius Ignat Посмотреть сообщение
А тебе интересно?
Мне интересно
Yandex
Объявления
01.03.2010, 12:47     Шаблоны
Ответ Создать тему

Метки
шаблоны
Опции темы

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