嵌套类模板特化

2024-04-19

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)"

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

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>{} or template<> class Nested<int>{}?


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

显式专业化应在包含的命名空间中声明 专门的模板。

但并不禁止创建部分专业化:

可以声明或重新声明类模板部分特化 在任何可以定义其定义的命名空间范围内(14.5.1 和 14.5.2)。

this

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

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

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

但你不能这样做

template<typename C, typename T>
template<>
class A<C, T>::Nested<int>
{
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌套类模板特化 的相关文章

随机推荐