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++ - 使用类成员函数创建 std::thread - 最佳实践

c++ - 无法接收 UDP 广播消息

c++ - 在 C++ 中将函数作为参数传递给模板?

javascript - Pug/Jade 中动态包含的解决方法

c++ - 为模板化类型确定正确谓词的方法

c++ - 我应该使用什么类型的迭代器差异来消除 "possible loss of data"警告?

c++ - 何时创建多少个线程?

C++计时: Get seconds with a precision of 3 decimal places

c++ - 如何在 C++ 中引用双重模板化的自由函数

c++ - 将 CTAD 与多个模板参数包一起应用