函数级别的部分模板类专用化

Partial template class specialization at function level

本文关键字:专用 函数      更新时间:2023-10-16

可能的重复项:
具有多个模板参数错误的模板部分专用化

是否可以将 e 模板类专门化为功能级别?

我会给你和我想要实现的目标的例子,但我得到编译错误:

template<typename T1, typename T2>
class C
{
    public:
        void f();
};
template<typename T1, typename T2>
void C<T1, T2>::f()
{
}
template<typename T1, int>
void C<T1, int>::f()
{
}

错误:

template argument list following class template name must list parameters in the order used in template parameter list
'void C<T1,T2>::f(void)' : function template has already been defined
'C<T1,T2>': template parameter 'T2' is incompatible with the declaration

如果你想使C::f的行为依赖于T2你可以尝试将其实现放到一个单独的类中,如下所示:

template <typename T>
class C_aux
{
public:
    void f() {}
};
template <>
class C_aux<int>
{
    void f() {}
};
template <typename T1, typename T2>
class C
{
    public:
        void f();
};
template <typename T1, typename T2>
void C<T1, T2>::f()
{
    C_aux<T2>::f();
}

根据您的需求细节,C_aux::f必须采用额外的参数。或者你可以让class C继承class C_aux,反之亦然。