成员功能的部分专业化

Partial specialization of member function

本文关键字:专业化 功能 成员      更新时间:2023-10-16

可能重复:
“无效使用不完整类型”部分模板专用化错误

为什么我能做到这一点:

template <typename T>
struct A
{
    void foo(int);
};
template <>
void A<int>::foo(int)
{
}

但不是这个:

template <typename> struct C {};
template <typename T>
struct A
{
    void foo(int);
};
template <typename T>
void A<C<T> >::foo(int)
{
}

对于第二种情况,GCC给出以下错误:

test.cpp:10:23: error: invalid use of incomplete type 'struct A<C<T> >'
test.cpp:4:8: error: declaration of 'struct A<C<T> >'

编辑

在解释为什么不允许使用第二个示例时,还请考虑将成员函数也作为模板对哪个示例有效,哪个示例无效没有影响。也就是说,这仍然有效:

template <typename T>
struct A
{
    template <typename U>
    void foo(U);
};
template <>
template <typename U>
void A<int>::foo(U)
{
}

但这不是:

template <typename> struct C {};
template <typename T>
struct A
{
    template <typename U>
    void foo(U);
};
template <typename T>
template <typename U>
void A<C<T> >::foo(U)
{
}

因此,原因不可能是函数模板只能完全专业化,因为第三个示例不是完全专业化(模板参数U仍然存在),但它仍然有效。

函数模板只能完全专业化,不能部分专业化。

您使用的事实是,类模板的成员函数本身就是函数模板,因此此规则仍然适用。


至于您的编辑:以下内容可以明确(即完全)专门化,从14.7.3/1开始:

以下任何一项的明确专业化:

--功能模板

--类模板

--类模板的成员函数

--类模板的静态数据成员

--类模板的成员类

--类模板的成员枚举

--类的成员类模板或类模板

--类的成员函数模板或类模板

可以通过template<>; 引入的声明进行声明

我强调了适用于你案件的两种说法。在没有任何其他明确规定的情况下,这些实体可以而不是部分专门化。