我正在更新一个有10年历史的代码库,并在Mac和Windows上使用Metrowerks code Warrior。
我正在更新到OS X,XCode 3.2,通用二进制。
我似乎收到了许多与模板相关的错误,并且不是模板方面的天才(并且忘记了早餐吃健康剂量的磨砂模板),我发现自己在思考模板的可移植性问题。
IIRC,模板是/或者可以是编译器特定的?
有没有人有关于他们推荐的模板的建议或教程?
发布于 2010-02-05 12:30:38
可以,也可以不可以--为一个当前编译器编写的最合理的模板代码在其他当前编译器上也能正常工作。编译器随着时间的推移不断进步,因此许多新代码不能在旧的编译器上工作,反之亦然。在新的编译器上使用旧代码的最大罪魁祸首是在相当多的地方需要"typename“,以便旧的编译器可以在没有它的情况下接受代码。
最常见的问题是这样的代码:
template <class T>
class XYZ {
T::y a;
};大多数较老的编译器会(错误地)将"T::y“解释为类型--但在模板中,实际上不可能确定这一点,因为T可能是任何类型。要使代码在现代(更准确)的编译器中工作,需要将其更改为:typename T::y a;,以便让编译器知道T::y是类型的名称。
发布于 2010-02-05 12:26:38
模板本身具有定义良好的行为,如标准中第14节所定义。
依赖于实现的是模板使用的限制。例如,附件B(其中列出了建议的最低限度):
如果您比这些更依赖于行为,那么它可能依赖于实现。应该注意的是,编译器不必提供这些最小限制来保持与标准兼容。
如果你发布了一些实际的代码/错误,我们可以告诉你为什么会出现错误。很可能,您的旧代码使用了一些编译器特定的扩展,或者被允许使用显式禁止的行为。
发布于 2010-02-05 12:35:25
编译器的能力在十年内有了很大的提高。
我会质疑编译器和STL 10年前的标准合规性。我相信这个标准十年前才刚刚推出,编译器需要一段时间才能跟上这个标准。
在现代编译器中,我想你会发现模板代码在编译器之间是相对可移植的,并且标准comitee对标准的更改非常小心,以确保它不会破坏兼容性(经常)。
https://stackoverflow.com/questions/2205012
复制相似问题