考虑以下代码:
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 命名空间中同时使用 T
和 A
,并在 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>
{
// ...
};
关于c++ - 内部类的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40614770/