【文件属性】:
文件名称:这是一个声明还是一个乘法运算?-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 是指这种情况: