内部 class 的模板专业化

Template specializations for inner class

考虑以下代码:

struct X
{
    template <typename T>
    class Y
    {};
 };
template<>
class X::Y<double>{
};

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

template<typename A>
struct X
{
    template <typename T>
    class Y
    {};
 };
template<typename A>
class X<A>::Y<double>{
};

编译器会报错:

'X::Y': explicit specialization is using partial specialization syntax, use template <> instead!

谁知道在这种情况下我如何专门化 class Y?

如果不显式特化外部模板,则无法特化内部模板 class。 See this question for more details and a quote from the standard.

解决方法: 创建一个外部 class,在 detail 命名空间中同时使用 TA,并在 X:

namespace impl
{
    template <typename A, typename T>
    struct Y { };
}

template<typename A>
struct X
{
    template <typename T>
    using Y = impl::Y<A, T>;
};

如果您可以明确特化内部和外部 class,您可以使用以下语法:

template <>
template <>
class X<int>::Y<double>
{
    // ...
};

Example on wandbox

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

#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;
}

[live demo]