我正在更新一个已有 10 年历史并在 Mac 和 Windows 上使用 Metrowerks Code Warrior 的代码库。
我正在更新到 OS X、XCode 3.2、Universal Binary。
我似乎遇到了很多与模板相关的错误,并且在模板方面不是天才(并且忘记在早餐时吃健康剂量的磨砂模板),我发现自己想知道模板的可移植性问题。
IIRC,模板是/或可以是特定于编译器的?
有没有人对他们推荐的模板有建议或教程?
最佳答案
是和否——为一个当前编译器编写的最合理的模板代码将在其他当前编译器上正常工作。编译器随着时间的推移不断进步,因此许多新代码无法在旧编译器上运行,反之亦然。在新编译器上使用旧代码的最大罪魁祸首是在很多地方需要“typename”,而旧编译器在没有它的情况下会接受代码。
最常见的问题是这样的代码:
template <class T>
class XYZ {
T::y a;
};
大多数旧编译器会(错误地)将“T::y”解释为一种类型——但在模板中,实际上不可能确定这一点,因为 T 可能是任何类型。要使代码适用于现代(更准确)的编译器,您需要将其更改为:typename T::y a;
,让编译器知道 T::y
是类型的名称。
关于C++ 模板可移植性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2205012/