嵌套 class 模板专业化

Nested class template specialization

A class:

template<typename C, typename T>
class A
{
    template <typename U>
    class Nested{};

    Nested<T> n;
};

我想专攻Nested。这是我尝试过的:

template<typename C, typename T>
class A
{
    template <typename U>
    class Nested{};

    template <>
    class Nested<int>{}; // by my logic this should work by I have a compilation error "explicit specialization in non-namespace scope 'class A<C, T>'"

    Nested<T> n;
};

我的下一次尝试:

template<typename C, typename T>
class A
{
    template <typename U>
    class Nested{};

    Nested<T> n;
};

template<>
A<>::Nested<int>{}; // What is the correct syntax to do it here? Now I have an error "wrong number of template arguments (0, should be 2)"

我在Whosebug上找到了一个解决方案:

template<typename C, typename T>
class A
{
    template <typename U, bool Dummy = true>
    class Nested{}; // why need of this Dummy??

    template <bool Dummy>
    class Nested<int, Dummy>{}; // why need to provide an argument??

    Nested<T> n;
};

它完美地工作,但我不明白如何。为什么要提供一个虚拟模板参数?为什么我不能使用原始专业化 template<> class Nested<int, true>{}template<> class Nested<int>{}

禁止在 class 范围内创建显式专业化:

An explicit specialization shall be declared in a namespace enclosing the specialized template.

但并不禁止创建偏特化:

A class template partial specialization may be declared or redeclared in any namespace scope in which its definition may be defined (14.5.1 and 14.5.2).

这个

template <bool Dummy>
class Nested<int, Dummy>{}; // why need to provide an argument??

是部分专业化,允许在 class 范围内创建此类专业化。您也无法在未专门化的外部 class 中完全专门化嵌套 class。你可以这样做:

template<>
template<>
class A<int, double>::Nested<int>
{
};

但你做不到

template<typename C, typename T>
template<>
class A<C, T>::Nested<int>
{
};

通过在外部 class 中定义专用模板 class 的所有内容,我设法让它发挥作用。所以所有的函数都是用 class 定义的。没有外部函数定义,因为它似乎无法编译。即

template <typename T, size_t N>
class A
{
private:
    template <size_t M>
    class B
    {
        ...
    };

    template <>
    class B<2>
    {
        ...
    };
    ... etc
};

它至少在 MS2015 上有效。代码 运行 很好。