我试图解决与现在看似过时的开源游戏有关的问题。因为我想玩它,我试图建立它并且可能能够添加一些东西。
不幸的是,我遇到了一些问题,而且我的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行)出现歧义错误。
编辑
在原型前面应用 constexpr 只需将constexpr添加到错误消息中。
删除并强制所有人使用标准库版本结果
/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:
答案 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)
至少答案当然,至于进一步提前编译进度是将违规函数包装在名称空间中。
感谢解决方案的人。