エンジンとアプリケーションという 2 つの主要な名前空間を含む大きなコード ベースがあります。
エンジンは、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++ プロジェクトでこのバグを再現しようとしましたが、壊れません。この問題を引き起こしている大きな大きなコード ベースに何かがあるに違いありませんが、どこから調べればよいかわかりません。ローグの「エンジンを使う」の逆みたいなもの?誰でもアイデアはありますか?