我有一个很大的代码库,其中包括两个主要的命名空间:引擎和应用程序。
引擎将vector3 类定义为另一个vector3 类的typedef,相等运算符位于引擎命名空间中,而不是vector3 类中。我向应用程序添加了一个类,该类在应用程序命名空间中也有相等运算符。
当我尝试编译时,不相关但附近的 vector3 比较失败,因为它找不到合适的相等运算符。我怀疑我引起了冲突,所以将我的相等运算符移到我添加的类中,编译成功。
// engine.h
namespace Engine
{
class Vector3Impl { ... };
typedef Vector3Impl Vector3;
bool operator==(Vector3 const &lhs, Vector3 const &rhs) { ... }
}
// myfile.cpp
#include "engine.h"
namespace application
{
class MyClass { ... };
bool operator==(MyClass const &lhs, MyClass const &rhs) { ... }
void myFunc(...)
{
if ( myClassA == myClassB ) { ... } // builds
}
void anotherFunc(...)
{
Engine::Vector3 a, b;
...
if ( a == b ) { ... } // fails
}
}
但是在考虑之后,我看不出编译失败的原因。没有从 vector3s 到我的类的隐式转换,反之亦然,并且依赖于参数的查找应该从引擎命名空间中拉入相等运算符并匹配它。
我尝试在示例 C++ 项目中重现此错误,但拒绝中断。大型代码库中一定有一些东西导致了这个问题,但我不确定从哪里开始寻找。类似于流氓“使用引擎”的反面?有人有什么想法吗?