Здравствуйте, Lenikur, Вы писали:
L>Привет! L>Определил шаблон в .h, реализацию его в .cpp. L>Компилируется все замечательно. А при линковке, в юните, где происходит инстанцирование, линковщик выкидывает unresolved external всех методов темплейла.. L>Я перенес всю реализацию в .h файл.. все заработало.. как это понимать?
таковы шаблоны в С++
реализация должна быть видна везде, где она используется, соответственно самое простое — поместить ее в h-файл.
Здравствуйте, Lenikur, Вы писали:
L>Определил шаблон в .h, реализацию его в .cpp. L>Компилируется все замечательно. А при линковке, в юните, где происходит инстанцирование, линковщик выкидывает unresolved external всех методов темплейла.. L>Я перенес всю реализацию в .h файл.. все заработало.. как это понимать?
Правильно понимать
Поскольку .h — это всего лишь подстановочный файл, то без потери общности мы можем копипастнуть его содержимое повсеместно:
// template_definitions.cpptemplate<class T>
class Foo
{
public:
void bar();
};
// определения шаблонных функций аналогичны инлайнамtemplate<class T>
void Foo<T>::bar() { ...... }
// В этом месте ни одного воплощения шаблона нет,
// и компилятор ничего не родил.
// Он же не знает, что...
//////////////////////////////
// template_usage.cpp
// объявление означает, что "где-то" есть реализацияtemplate<class T>
class Foo
{
public:
void bar();
};
main()
{
Foo<int> foo;
foo.bar(); // а реализация-то где? йок.
}
Перекуём баги на фичи!
Re[3]: Template определение и реализация в разных юнитах.. п
Здравствуйте, Lenikur, Вы писали:
L>Не, не новый.. Builder 5. Export пробовал, не помогло. L>Всем спасибо, помогли.
Ни в 5ом, ни в 6ом, ни в билдерХ компилятор (5.5, 5.6 и т.д.) экспорт не поддерживают. Только в 6ом просто распознается ключевое слово экспорт. А вот в Борланд С++ technical Preview новый компилятор и компоновщик. И экспорт поддерживается.
Of course, the code must be complete enough to compile and link.
Template определение и реализация в разных юнитах.. проблема
Привет!
Определил шаблон в .h, реализацию его в .cpp.
Компилируется все замечательно. А при линковке, в юните, где происходит инстанцирование, линковщик выкидывает unresolved external всех методов темплейла..
Я перенес всю реализацию в .h файл.. все заработало.. как это понимать?
Re: Template определение и реализация в разных юнитах.. проб
Здравствуйте, Димчанский, Вы писали:
Д>Попробуй сделать примерно так (пишу общую идею): ...
Д>и включаешь этот файл в проект. Это один из методов, если не хочешь всё пихать в один h-файл.
Выглядит сильно..
Боюсь только это добавит запутанности.. но спасибо конечно.
Честно говоря, я не знал, что инстанированный класс шаблона это новый тип.
Re[3]: Template определение и реализация в разных юнитах.. п
Здравствуйте, Lenikur, Вы писали:
L>Выглядит сильно.. L>Боюсь только это добавит запутанности.. но спасибо конечно.
Я читал, что подобный подход в больших проектах вроде как должен увеличить скорость компиляции по сравнению с тем, если всё юудет в одном h-файле. Так как в последнем случае в разных единицах трасляции ссылки на один и тот же MyClass<int> могут приводить к повторному инстанцированию шаблона с заданным аргументом шаблона. Вроде так.
L>Честно говоря, я не знал, что инстанированный класс шаблона это новый тип.
Если шаблонный класс — на самом деле целое семейство классов, то его инстанцирование просто выделяет из этого огромного множества какой-то один класс.