Есть ли способ предварительной компиляции некоторых шаблонных мгновений (шаблона класса), но не всех, чтобы оставшиеся компилировались при мгновенном запуске (без ошибок при соединении)?
Чтобы продемонстрировать проблему, рассмотрим следующий пример:
// file.h
template<typename T> class object { /* lots of code */ };
// file.inc
template<typename T>
object::object(const T*data) { /* ... */ }
// and more: definitions of all non-inline functionality of class object<>
// file.cc to be compiled and linked
#include "file.h"
#include "file.inc"
template struct<int>;
template struct<double>;
// user.cc
#include "user.h"
#include "file.h"
object<double> x{0.4} // okay: uses pre-compiled code
object<user_defined> z(user_defined{"file.dat"}); // error: fails at linking
Если вместо этого пользователь #include
s "file.inc"
// user.cc
#include "user.h"
#include "file.h"
#include "file.inc"
object<double> x{0.4} // error: duplicate code
object<user_defined> z(user_defined{"file.dat"}); // okay
компилятор найдет другую скомпилированную версию из-за предварительно скомпилированного кода из file.cc
.
Так как же мне избежать обеих этих проблем? Я считаю, что связанный с этим вопрос будет звучать так: «Как я могу указать, что предварительно скомпилированный заголовок полностью компилирует шаблон для определенных параметров шаблона (только)?»