这是一个声明还是一个乘法运算?-data mining. concepts and techniques 3rd edition英文原版

时间:2024-06-27 16:59:50
【文件属性】:

文件名称:这是一个声明还是一个乘法运算?-data mining. concepts and techniques 3rd edition英文原版

文件大小:1.79MB

文件格式:PDF

更新时间:2024-06-27 16:59:50

c++ templates

Trap::x*y; // (2) 这是一个声明还是一个乘法运算? } }; template<> class Trap { // 「恶意」特化 public: typedef int x; // (3) 在这里,x 是个类型 }; void boom(Victim& bomb) { bomb.poof(); } 当编译器对(2)进行 parsing 时,它必须确定(2)是个声明还是个乘法,而这取决于「受控 受饰 名称」(dependent qualified name)Trap::x 是不是一个类型名称。你可能会想去 template Trap 里头查看,于是从(1)得知 Trap::x 不是类型,这就使我们认为(2)是个乘法。然 而稍后的 程序代码打破了这种想法:令 T 为 void,将泛化的 Trap 加以特化,于是 Trap::x 事实上 成了 int 类型。 C++ 语言对此问题做出了明确的规定:通常一个「受控受饰名称」(dependent qualified name) 并不指涉某个类型,除非该名称以关键词 typename 为前导。如果在 template arguments 替换 过 程之后,该名称 终并不是个类型名称,则编译器认为程序不合法,并在具现期 ( instantiation time)报错。注意此处的 typename 关键词并非用来指涉一个 template type parameter 参数,因 此它和 type parameter 不同,你不能把 typename 换以 class。下列情况的名 称必需加上 typename 前导: 1. 该名称在 template 中出现。 2. 该名称是个受饰名称(qualified name)。 3. 该名称不被用于 base class list,也不被用于构造函数的成员初值列(member initializers)。 译注:上述说的 base class list 是指这种情况:


网友评论