c++ - 内部类的模板特化

标签 c++ metaprogramming template-specialization

考虑以下代码:

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

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

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!

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

最佳答案

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

解决方法:创建一个外部类,在 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>;
};

如果您可以显式特化内部类和外部类,则可以使用以下语法:

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

Example on wandbox

关于c++ - 内部类的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40614770/

相关文章:

c++ - typename 参数的模板特化是特定模板的任何实例化

c++ - 应用程序停止后 Qt 关闭托盘图标

c++ - 在同一个程序中使用 cereal 和 boost 序列化

c++ - 如何在 OpenCL 内核中使用 C++ 模板?

python - Python 中的自变形代码可能吗?

c++ - 静态检查 const char* 包含空格

c++ - 在不知道值类型的情况下从前向迭代器获取反向迭代器

c++ - MFC 将 Handle 转换为指针并将 DIB 转换为 DDB

c++ - 函数模板特化编译错误

c++ - 显式特化模板、静态与重复符号