考虑一下。有一个类Derived
继承自重模板类的一些实例化,并且在各种源文件中Base
有很多用途。Derived
因此,只有一个Derived
的特定实例化是合理的Base
。
C++11 允许这个 via extern template
,但这里的问题是我只想键入一次的Derived
-specific 实例化Base
。从技术上讲这是可能的,因为Derived
可以为该实例化一个别名,但问题是:它仍然会强制编译器不实例化模板吗?
这是尝试:
// Base.hpp
template < typename Arg > struct Base { using TheArg = Arg; };
// Derived.hpp
#include "Base.hpp"
struct Derived : Base<int> { };
// The next line will be huge in real-world scenario, so I want to avoid it.
// extern template struct Base<int>;
// Instead I want this.
extern template struct Base<Derived::TheArg>;
// Derived.cpp
#include "Derived.hpp"
template struct Base<Derived::TheArg>;
// Use01.cpp
#include "Derived.hpp"
void use01() { Derived dd; }
这里的重点是强制Use01.cpp
不实例化,而是Base<int>
引用显式实例化。Derived.cpp
我正在编译,gcc-v9.3
问题是:
- 声明是否
extern template
对翻译单元中的所有实例生效,还是仅对出现在其声明之后的实例生效? - 使用
Derived::TheArg
而不是int
延迟实例化会导致任何问题吗?
将extern template
声明放在末尾Use01.cpp
并注释掉显式实例化Derived.cpp
会使编译失败,所以这让我相信extern template
声明不必出现在任何实例化之前,所以第二个问题仍然有意义。