是和否 - 为一个当前编译器编写的最合理的模板代码可以在其他当前编译器上正常工作.随着时间的推移,编译器已经取得了进展,因此许多新代码无法在旧编译器上运行,反之亦然.在新编译器上使用旧代码的最大罪魁祸首是在很多地方需要"typename",旧的编译器会接受没有它的代码.
最常见的问题是代码是这样的:
template <class T>
class XYZ {
T::y a;
};
Run Code Online (Sandbox Code Playgroud)
大多数较旧的编译器会(错误地)将"T :: y"解释为类型 - 但在模板中,实际上不可能确定这一点,因为T可能是任何类型.要使代码与现代(更准确)编译器一起工作,您需要将其更改为:typename T::y a;,让编译器知道这T::y是类型的名称.