выборочная компиляция шаблона - PullRequest
0 голосов
/ 05 сентября 2018

Есть ли способ предварительной компиляции некоторых шаблонных мгновений (шаблона класса), но не всех, чтобы оставшиеся компилировались при мгновенном запуске (без ошибок при соединении)?

Чтобы продемонстрировать проблему, рассмотрим следующий пример:

// 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.

Так как же мне избежать обеих этих проблем? Я считаю, что связанный с этим вопрос будет звучать так: «Как я могу указать, что предварительно скомпилированный заголовок полностью компилирует шаблон для определенных параметров шаблона (только)?»

1 Ответ

0 голосов
/ 05 сентября 2018

Вы можете использовать extern template, чтобы предотвратить конкретную реализацию шаблона в данном TU.

// src0.cpp

template class foo<int>;
    // Oblige instantiation of `foo<int>` in this TU

// src1.cpp

extern template class foo<int>;
    // Prevent instantiation of `foo<int>` in this TU

Пока src0 и src1 связаны друг с другом, ваша программа будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...