模板类成员函数仅专用化
template class member function only specialization
我正在阅读模板完整指南,它说:
它谈论的是类模板专业化。
虽然可以专门化单个成员函数类模板,一旦你这样做了,你就不能再专攻了专用成员所属的整个类模板实例自。
我实际上想知道这是怎么回事,因为您可以在没有任何成员函数的情况下进行专业化。 是说你不能只有一个成员函数的专用化,然后是另一个所有成员函数的专用化?
有人可以澄清一下吗?
我认为它指的是以下情况:
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>;
)时,泛型类的所有成员都将存在于实例化的类中。但是,假设通过提及类主体来描述类专业化。只有专用类中显式定义的成员(无论是泛型类中已存在的成员还是新成员)才会出现在实例化类中。
的)成员函数是通过特定的作用域类专用化定义的,则隐式实例化一个专用类,该类将以适当的专用方式具有这些函数以及泛型类中存在的所有其他成员。
在第二种情况下,由于专用类已被隐式实例化,因此我们以后不能通过显式实例化或提及类体来定义具有相同专用化的类。为了添加特定于该专业化的成员,可能需要执行后者。在这种情况下这是不可能的,因为编译器已经实例化了一个专门的类。
无论以何种方式实例化类专用化,用户始终可以自由地基于其他模板参数实例化其他专用化。
相关文章:
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 具有常量引用参数的函数模板专用化
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- C++模板专用化 - 无法匹配函数定义
- 具有专用化的模板类中的可靠条件复制和移动构造函数
- 如何使专用函数模板成为某个类的朋友?
- 如何按类型为元组元素创建专用函数
- 无法访问专用函数
- 使用指向部分专用函数成员的指针自动填充向量
- 64 位 G++ 4.6.3 不会在专用函数模板中将长整型视为长整型,即使它们的大小相同。这是一个错误吗?
- 操作员过载的专用函数
- C++调用模板专用函数
- 模板类中专用函数的声明
- 使用专用函数对异构集合的 STL 算法
- C++专用函数-不在此范围内错误
- 为什么我不能专用函数模板?
- 用于专用函数参数的模板
- 代码重复和模板专用化(当专用函数具有不同的返回类型时)
- 具有专用函数的Pull-Apart函数类型
- 专用函数模板