Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GCC中的表达式中间体(如果它们实际上被称为)_C++_Templates_Gcc_Operator Overloading - Fatal编程技术网

C++ GCC中的表达式中间体(如果它们实际上被称为)

C++ GCC中的表达式中间体(如果它们实际上被称为),c++,templates,gcc,operator-overloading,C++,Templates,Gcc,Operator Overloading,我试图转换一个用VS编写的数学库,这样它就可以通过GCC编译。问题是,我有很多重载运算符,它们看起来像这样: 模板 内联四元数运算符+(四元数&a,四元数&b) {返回四元数(a.x+b.x,a.y+b.y,a.z+b.z,a.w+b.w);} 等等 问题是:这些运算符的设计假设其他编译器将支持为以下表达式创建的自动中间体: … 四元数q=log(exp(q0)*t) … 如果没有它们,上述情况将需要转变为: … 四元数tmp=exp(q0) tmp*=t 四元数q=log(tmp) …

我试图转换一个用VS编写的数学库,这样它就可以通过GCC编译。问题是,我有很多重载运算符,它们看起来像这样:


模板

内联四元数
运算符+(四元数
&a,四元数
&b)
{返回四元数
(a.x+b.x,a.y+b.y,a.z+b.z,a.w+b.w);}

等等

问题是:这些运算符的设计假设其他编译器将支持为以下表达式创建的自动中间体:


四元数
q=log(exp(q0)*t)

如果没有它们,上述情况将需要转变为:


四元数
tmp=exp(q0)
tmp*=t
四元数
q=log(tmp)

这只是一个简单的例子。使用这个库的系统中的一些表达式会扩展到几百行——考虑到调试汇编风格的数字代码所涉及的开销(例如,一个扩展超过600行的函数)至少是天文数字,这是非常令人不快的

在我看来,在语言中引入重载运算符的整个机制只是为了为普通函数提供不同的命名约定,而在数学表达式方面却没有真正的语法优势,这似乎是不合理的

但是,当然,我希望我的假设是错误的

这让我不禁要问:GCC是否有能力创建自动中间产品?如果没有,除了MS品牌,还有哪些编译器能够做到这一点


还是我完全用了错误的方法,并且有更好的方法来产生相同的效果?

您的非修改运算符需要通过常量引用获取其参数,例如

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);}
模板
内联四元数运算符+(常数四元数和a、常数四元数和b)
{返回四元数(a.x+b.x,a.y+b.y,a.z+b.z,a.w+b.w);}

标准C++不允许你将未命名的临时变量(中间值)绑定到非const引用。听起来MSVC++可能允许将其作为扩展。

您的非修改运算符需要通过常量引用获取其参数,例如

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);}
模板
内联四元数运算符+(常数四元数和a、常数四元数和b)
{返回四元数(a.x+b.x,a.y+b.y,a.z+b.z,a.w+b.w);}

标准C++不允许你将未命名的临时变量(中间值)绑定到非const引用。听起来像MSVC++可以允许这是一个扩展。

< P>你所显示的代码不需要为GCC或任何其他功能正常的C++编译器重写。C++需要编译器能够生成临时(你称中间的),包括你所显示的。虽然gcc接受的代码和VC++接受的代码之间存在一些差异,但它们通常都很小(通常VC++接受理论上不应该接受的代码)。在上面的代码中,您正好做到了:您通过非常量引用传递参数,但是临时变量应该只能通过值或常量引用传递。如果改变了这一点,gcc应该接受代码


如果你还有其他问题,我的建议是直接问你试图向GCC传送的代码的一些问题,并告诉你在这样做时遇到的问题。

< P>你所显示的代码不需要为GCC或任何其他功能正常的C++编译器重写。C++需要编译器能够生成临时(你称中间的),包括你所显示的。虽然gcc接受的代码和VC++接受的代码之间存在一些差异,但它们通常都很小(通常VC++接受理论上不应该接受的代码)。在上面的代码中,您正好做到了:您通过非常量引用传递参数,但是临时变量应该只能通过值或常量引用传递。如果改变了这一点,gcc应该接受代码


如果您有其他问题,我的建议是更直接地问另一个问题,关于您尝试移植到gcc的一些代码示例,并告诉您在移植过程中遇到的问题。

感谢您的回答,尽管我的疏忽非常简单。我想忘记这样的细节是我在默认设置下使用MS编译器太长时间所得到的:感谢回复,尽管我非常简单的疏忽。我想忘记这些细节是我在默认设置下使用MS编译器太久的结果:PIt发现是[not]通过const得到了我。我把引用改成了const,然后它被编译了。结果是[not]经过const得到了我。我将引用改为const,并编译了它。