Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / шаблонная ф-ия / 10 сообщений из 10, страница 1 из 1
13.11.2007, 10:16:02
    #34934311
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
шаблонная ф-ия
Как правильно отделить в шаблонной ф-ии объявление от реализации, так не понимает:

Код: plaintext
1.
2.
3.
4.
// a.h

template <typename T>
void numTOstring(std::string &res_str, const T num);

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
// a.cpp
#include "a.h"


/*
Конвертирует число в std::string
*/
template <typename T>
void numTOstring(std::string &res_str, const T num)
{
	std::ostringstream oss;
	oss << num;
	res_str += oss.str();
}// numTOstring()
...
Рейтинг: 0 / 0
13.11.2007, 10:22:05
    #34934333
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
шаблонная ф-ия
Должно. Дай угадаю - ругается линкер, верно?
...
Рейтинг: 0 / 0
13.11.2007, 10:22:30
    #34934335
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
шаблонная ф-ия
И не поймет, все только в h? иначе невозможно инстанциирование
...
Рейтинг: 0 / 0
13.11.2007, 10:23:55
    #34934343
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
шаблонная ф-ия
AkhДолжно. Дай угадаю - ругается линкер, верно?
верно
...
Рейтинг: 0 / 0
13.11.2007, 10:27:33
    #34934366
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
шаблонная ф-ия
Tubrik AkhДолжно. Дай угадаю - ругается линкер, верно?
верно

тода смотри ответ blinded. :)
...
Рейтинг: 0 / 0
13.11.2007, 10:34:25
    #34934384
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
шаблонная ф-ия
т.е. разделять их нельзя никак?
...
Рейтинг: 0 / 0
13.11.2007, 10:43:13
    #34934412
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
шаблонная ф-ия
Это зависит от реализации компилятора.... Есть в которых можно, а есть в которых нельзя.
Читать http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Template-Instantiation.html]здесь[/url
...
Рейтинг: 0 / 0
13.11.2007, 10:44:50
    #34934415
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
шаблонная ф-ия
сделал так:

1. Удалил файл .cpp из проекта, но оставил физически.
2. Вконце файла .h сынклудил .cpp

по сути тоже самое, но все же больше напоминает раздельное объявление

что интересно, объявленная вместе с телом ф-ия в .h собирается нормально, но только если она шаблонная
...
Рейтинг: 0 / 0
13.11.2007, 10:48:08
    #34934433
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
шаблонная ф-ия
Tubrikт.е. разделять их нельзя никак?

реализации шаблонов в объектный файл не включаются - это не функции, а некий прототип. В объектные файлы включаются их частные инстанцированные варианты. Сколько различных версий ты инстанцируешь, для int, для double, для MyBiGSuperPuperClassForever, столько их и включиться. Как компилятор в твоем случае может догадаться, что нужно скомпилировать реализацию шаблона для типа, который ты будешь использовать. Ответ - никак. Следовательно, надо включать реализацию шаблона в код, который его использует. Т.о. будет происходить автоматическое инстанцирование.
...
Рейтинг: 0 / 0
13.11.2007, 10:51:50
    #34934453
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
шаблонная ф-ия
Tubrikчто интересно, объявленная вместе с телом ф-ия в .h собирается нормально, но только если она шаблонная

Инстанцировнные функции в объектном файле имеют "слабое" связывание, в отличии от обычных, поэтому, линковщик и не ругается, а выбирает, ту, которую на душу положит. Можно конечно, предположить, что он для модуля будет давать больше приоритет функции, которая находиться в этом же модуле, но рисковать не стоит. Я взял за правило иметь одну реализацию в проете, т.е. реализацию шаблонной функции помещать в заголовочный файл (вариант, как ты инклудишь сpp с реализаций).
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / шаблонная ф-ия / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]