我正在尝试转换用VS编写的数学库,因此它将通过GCC编译。麻烦的是,我有很多重载的运算符看起来像这样:
template
<typename T>
inline quaternion<T>
operator+(quaternion<T>
&a, quaternion<T>
&b)
{return quaternion<T>
(a.x+b.x,a.y+b.y,a.z+b.z,a.w+b.w);}
等等。
问题是:这些运算符是在假设其他编译器支持为以下表达式创建的自动中间体的情况下设计的:
<typename T>
没有它们,上面需要变成:
<T>
这只是一个简单的例子。使用这个库的系统中的一些表达式将扩展到数百行 - 考虑到调试汇编式数字代码所涉及的开销,例如,一个超过600行的单个函数,这是令人非常不愉快的。至少。
对我来说,将重载运算符的整个机制引入语言只是为普通函数提供不同的命名约定似乎是不合理的,而在数学表达式方面却没有提供真正的语法优势。
但是,当然,我希望我假设这是错误的。
这让我想问:GCC是否有能力创造自动中间体?如果没有,除了MS品牌之外的哪些编译器能够做到这一点?
或者我是否完全以错误的方式解决了这个问题,并且有更好的技术来创造相同的效果?
答案 0 :(得分:4)
你的非修改运算符需要通过 const 引用来获取它们的参数,例如
template<typename T>
inline quaternion<T> operator+(const quaternion<T> &a, const quaternion<T> &b)
{return quaternion<T>(a.x+b.x,a.y+b.y,a.z+b.z,a.w+b.w);}
标准C ++不允许您将未命名的临时值(您的中间值为)绑定到非const引用。听起来MSVC ++可能允许将其作为扩展。
答案 1 :(得分:3)
您显示的代码不需要重写gcc或任何其他正常运行的C ++编译器。 C ++要求编译器能够生成临时(您称之为中间体),包括您展示的那些。虽然gcc接受的内容与VC ++接受的内容之间存在的一些差异,但它们通常很小(通常VC ++接受的代码理论上不应该这样)。在上面的代码中,你完全是这样的:你通过非const引用传递参数,但临时数只能通过值或const引用传递。改变这一点,gcc应该接受代码。
如果您还有其他问题,我的建议是更直接地询问您尝试移植到gcc的代码示例,并告诉您在执行此操作时遇到的问题。