C++ 模板可移植性

标签 c++ templates

我正在更新一个已有 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/

相关文章:

c++ - 如何使用 C API for Lua 在控制台中打印错误

c++ - 在运行时获取/设置模板结构的静态成员

c++ - Visual C++ - 虚拟方法未被覆盖

c++ - 无法将字段声明为嵌套模板中的抽象类型

c++ - 为什么我不能使用 protected 嵌套类作为另一个嵌套 protected 类的模板参数?

c++ - 使用大型系统的编程模板

c++ - 如何在 Qt 中附加一些 MP3?

c++ - C++ 中的 RSA 加密

c++ - 队列类中的运算符 <<

c++ - 自动为使用 dlopen() 加载的类创建包装器