嵌套 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 上有效。代码 运行 很好。
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 上有效。代码 运行 很好。