为何extern template class对std::basic_string<char>未按预期生效?
原因说明
extern template的设计作用是阻止当前翻译单元对指定模板特化执行隐式实例化,而非禁止整个程序存在该模板特化的实例。出现你观察到的差异,本质是两个模板特化的实例化定义位置不同:
- 自定义模板
A<int>的报错原因
你在当前翻译单元声明了extern template struct A<int>;,编译器会跳过A<int>所有非inline成员的隐式实例化。而整个编译链接流程中,没有其他翻译单元提供A<int>的显式实例化定义,因此链接时找不到A<int>::get() const的符号,直接报错。 std::string无报错的原因
你使用的g++对应的标准库实现libstdc++,已经在自身的预编译库文件中提前显式实例化了std::basic_string<char>(即std::string)的全部常用成员函数。你当前翻译单元虽然没有隐式实例化std::string的相关成员,但链接阶段会自动链接标准库,直接拿到已经存在的实例化符号,因此不会报链接错误。
补充:如果模板成员函数是类内定义的inline函数,
extern template声明对其不生效,编译器仍会在当前翻译单元生成inline函数的本地实现,也不会出现链接错误。
内容的提问来源于stack exchange,提问作者xmllmx
相关产品推荐
相关产品推荐

