内部类的模板专业化

MEM*_*EMS 5 c++ metaprogramming template-specialization

考虑以下代码:

struct X
{
    template <typename T>
    class Y
    {};
 };
template<>
class X::Y<double>{
};
Run Code Online (Sandbox Code Playgroud)

在这里,我们将 Y 类专门用于 double 类型,并且代码运行良好。问题是,如果我将代码更改为:

template<typename A>
struct X
{
    template <typename T>
    class Y
    {};
 };
template<typename A>
class X<A>::Y<double>{
};
Run Code Online (Sandbox Code Playgroud)

编译器会报错:

'X::Y':显式专业化正在使用部分专业化语法,请使用模板 <> 代替!

有人知道在这种情况下我该如何专业化 Y 类吗?

W.F*_*.F. 2

简单的答案 - 你不能完全专门化模板化外部类的模板化内部类。但如果你真的想达到类似的效果,你可以尝试使用虚拟默认模板参数进行部分特化:

#include <iostream>

template<typename A>
struct X
{
    template <typename T, T* =nullptr>
    class Y{};
 };

template<typename A>
template<double *Ptr>
class X<A>::Y<double, Ptr> {
public:
    static constexpr int value = 1;
};

int main() {
    std::cout << X<int>::Y<double>::value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

[现场演示]