/* тут только объявления методов */
};
// Сюда вынесены все реализации методов шаблона
extern template class Type<int>;
Этот хедер включен в несколько TU, шаблон в каждой из них инстанцируется типом int. В одной из TU прописано:
template class Type<int>;
Все это работает как надо: только в одной TU шаблон инстанцируется, во всех остальных компилятор "верит", что где-то есть инстанцирование. Линкер все успешно собирает.
Но буду ли я прав, что при компиляции каждой TU компилятор проверяет на корректность реализацию методов? То есть, по сути, он в каждой TU выполняет одну и ту же работу?
А у тебя это все в хедере?
Да. Хедер включен в разные TU
Ну будет выполнять одну и ту же работу. Хотя я не уверен. Должен ли линкер ругаться на то что символы несколько раз определены 🧐
Они не определены несколько раз. Там же есть extern template
Ну это же явное инстанцирование шаблона
Из сообщения я так понял что у тебя в каждом хедере есть реализации методов. Потом ты спрашиваешь, > компилятор проверяет на корректность реализации методов Ну, у него в TU каждом есть реализация. Не понял вопрос, короче.
У меня один хедер
Ну он же инклюдится в каждый TU
И че там проверять?
В любом случае даже если он делает некую "двойную работу", кому не насрать на время компиляции? Там и так этих шаблонов наворотили что может комилироваться десять лет, зато работает в рантайме быстро!
Мне не насрать. Потому что ждать каждый раз по 3 минуты задолбало.
Может быть у тебя горлышко в другом месте каком-то?
А что значит extern template class Type<int>; ? Я хочу, чтоб ты, компилятор, знал, что Type - это некий шаблон класса с шаблонным параметром типа , заданным в int. Зачем тут extern ?
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Для того, чтобы сказать компилятору: "Не инстанцируй этот шаблон типом int. Я тебе атвичаю, инстанцирование есть в другой TU".
Обсуждают сегодня