C ++重载Copysign运算符冲突或模糊

时间:2017-02-27 23:56:20

标签: c++ open-source

我试图解决与现在看似过时的开源游戏有关的问题。因为我想玩它,我试图建立它并且可能能够添加一些东西。

不幸的是,我遇到了一些问题,而且我的C ++技能无可否认。

In file included from /home/talrose/projects/Vegastrike/engine/src/cmd/../gfx/camera.h:24:0,
             from /home/talrose/projects/Vegastrike/engine/src/cmd/beam_generic.cpp:8:
/home/talrose/projects/Vegastrike/engine/src/physics.h:30:34: error: ‘float copysign(float, float)’ conflicts with a previous declaration
float copysign( float x, float y );
                              ^
In file included from /usr/include/c++/6/math.h:36:0,
             from /projects/Vegastrike/engine/src/vs_math.h:27,
             from /projects/Vegastrike/engine/src/vegastrike.h:36,
             from /projects/Vegastrike/engine/src/cmd/beam_generic.cpp:1:
/usr/include/c++/6/cmath:1288:3: note: previous declaration ‘constexpr float std::copysign(float, float)’
copysign(float __x, float __y)
   ^~~~~~~~
CMakeFiles/engine_com.dir/build.make:614: recipe for target 'CMakeFiles/engine_com.dir/src/cmd/beam_generic.o' failed
make[2]: *** [CMakeFiles/engine_com.dir/src/cmd/beam_generic.o] Error 1
CMakeFiles/Makefile2:262: recipe for target 'CMakeFiles/engine_com.dir/all' failed
make[1]: *** [CMakeFiles/engine_com.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

可以找到physics.h文件here

我有一种感觉,以前,只是有一个infile声明足以提供"偏好"对于编译器,但现在不是这样的。如果有人可以解释这背后的问题,我将不胜感激,以便我将来可以更好地解决它。

我已尝试将其评论出来,这导致更深层次的代码(超过4000行)出现歧义错误。

编辑

  1. 在原型前面应用 constexpr 只需将constexpr添加到错误消息中。

  2. 删除并强制所有人使用标准库版本结果

    /usr/include/c++/6/cmath:1288:3: note: candidate: constexpr float std::copysign(float, float)
    copysign(float __x, float __y)
       ^~~~~~~~
    /projects/Vegastrike/engine/src/cmd/unit_generic.cpp:633:7: note: candidate: float copysign(float, float)
     float copysign( float x, float y )
           ^~~~~~~~
    /projects/Vegastrike/engine/src/cmd/unit_generic.cpp:3443:61: error: call of overloaded ‘copysign(float, const float&)’ is ambiguous
             Res.j = copysign( fuelclamp*limits.vertical, amt1.j );
                                                                 ^
    In file included from /usr/include/features.h:364:0,
                     from /usr/include/x86_64-linux-gnu/c++/6/bits/os_defines.h:39,
                     from /usr/include/x86_64-linux-gnu/c++/6/bits/c++config.h:502,
                     from /usr/include/c++/6/bits/stl_algobase.h:59,
                     from /usr/include/c++/6/bits/stl_tree.h:63,
                     from /usr/include/c++/6/set:60,
                     from /projects/Vegastrike/engine/src/cmd/unit_generic.cpp:4:
    

3 个答案:

答案 0 :(得分:0)

只需在前向声明前添加'constexpr',以便它与cmath中的声明匹配。

答案 1 :(得分:0)

我认为如果你以正确的方式眯着眼睛,那么代码就不是格式良好的C ++,即使它是格式良好的C:

C允许用户代码从C标准库声明名称,包含相关标题。

C ++ 允许用户代码(重新)声明命名空间std中的名称。

C ++的“C头”(附件D)表示,未指定是否首先在c name 中的名称空间std中声明名称,然后将其拉入中的全局名称空间通过 using-declaration 或其他方式命名 .h。因此,您必须假设在C ++中使用兼容性标头 name .h并使用全局名称时,该名称可能已在名称空间std中声明,并且全局名称空间包含 using-declaration ,因此不允许您声明该名称。

简而言之,并非所有C代码都是有效的C ++,并且您已经找到了一个例子。问题的唯一原因是您的C ++库已选择将constexpr添加到其允许的copysign声明中,因为它假定您没有声明其名称。< / p>

答案 2 :(得分:0)

至少答案当然,至于进一步提前编译进度是将违规函数包装在名称空间中。

感谢解决方案的人。