模板类成员函数仅专用化

template class member function only specialization

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

我正在阅读模板完整指南,它说:

它谈论的是类模板专业化。

虽然可以专门化单个成员函数类模板,一旦你这样做了,你就不能再专攻了专用成员所属的整个类模板实例自。

我实际上想知道这是怎么回事,因为您可以在没有任何成员函数的情况下进行专业化。 是说你不能只有一个成员函数的专用化,然后是另一个所有成员函数的专用化?

有人可以澄清一下吗?

我认为它指的是以下情况:

template <typename T>
struct base {
   void foo() { std::cout << "generic" << std::endl; }
   void bar() { std::cout << "bar" << std::endl; }
};
template <>
void base<int>::foo() // specialize only one member
{ 
   std::cout << "int" << std::endl; 
}
int main() {
   base<int> i;
   i.foo();         // int
   i.bar();         // bar
}

一旦完成,您就不能将整个模板专用为任何其他东西,因此

template <>
struct base<int> {};  // error
我认为

这意味着您可以:

  • 专用化整个类,并且必须声明和定义所有成员(数据和函数,静态与非静态,虚拟与否),即使它们与非专用版本相同,

  • 专用化某些函数成员,
  • 但随后不能专用化整个类(即所有成员的声明方式与非专用情况相同,您只需为某些函数成员提供实现)。

可以记住显式和隐式实例化以及如下所示的情况。

当一个类被显式实例化(template class Class_Template<Explicit_Type>;)时,泛型类的所有成员都将存在于实例化的类中。但是,假设通过提及类主体来描述类专业化。只有专用类中显式定义的成员(无论是泛型类中已存在的成员还是新成员)才会出现在实例化类中。

假设(泛型类

的)成员函数是通过特定的作用域类专用化定义的,则隐式实例化一个专用类,该类将以适当的专用方式具有这些函数以及泛型类中存在的所有其他成员。

在第二种情况下,由于专用类已被隐式实例化,因此我们以后不能通过显式实例化或提及类体来定义具有相同专用化的类。为了添加特定于该专业化的成员,可能需要执行后者。在这种情况下这是不可能的,因为编译器已经实例化了一个专门的类。

无论以何种方式实例化类专用化,

用户始终可以自由地基于其他模板参数实例化其他专用化。