如何在父类模板外部特化嵌套模板类的析构函数?
问题解决:嵌套模板析构函数特化的编译错误
你遇到的问题是C++标准不允许对外层类模板的成员模板的析构函数进行显式特化——因为Outer<T>本身是依赖模板参数T的未实例化模板,此时无法针对Details<true>或Details<false>的析构函数单独特化。
要在不把Details的实现全部移入Outer类内的前提下解决这个问题,可以通过偏特化整个Details模板来替代析构函数的单独特化,具体实现如下:
#include <type_traits> template<typename T> struct Outer { // 声明主模板,不定义具体成员 template<bool = std::is_trivially_destructible<T>::value> struct Details; }; // 偏特化true版本的Details,在外层类模板外定义 template<typename T> template<> struct Outer<T>::Details<true> { ~Details() { // do some stuff } }; // 偏特化false版本的Details,在外层类模板外定义 template<typename T> template<> struct Outer<T>::Details<false> { ~Details() { // do some other stuff } };
思路说明
- 先将
Details的主模板声明留在Outer内部,仅做声明不定义具体成员 - 在外层类模板的作用域之外,对
Outer<T>::Details<true>和Outer<T>::Details<false>分别做显式偏特化,在特化的结构体中直接定义析构函数 - 这种写法完全符合C++标准规则,可在Clang、GCC、MSVC等主流编译器正常编译运行
内容的提问来源于stack exchange,提问作者user3612643
相关产品推荐
相关产品推荐

