选择性编译模板

问题描述 投票:0回答:1

有没有办法预编译一些模板即时(类模板)但不是全部,所以剩余的是在瞬时编译时编译(没有链接错误)?

要演示此问题,请考虑以下示例:

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

如果相反用户#includes "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的预编译代码,编译器将找到另一个编译版本。

那我怎么能避免这两个问题呢?我认为一个相关的问题是“如何指定预编译的头文件完全编译某些模板参数的模板(仅)?”

c++ templates compilation
1个回答
1
投票

您可以使用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

只要src0src1连接在一起,您的程序就可以运行。

© www.soinside.com 2019 - 2024. All rights reserved.