저는 엔진과 응용 프로그램의 두 가지 주요 네임 스페이스를 포함하는 커다란 코드 기반을 확보했습니다.함수 오버로드가 실패합니다. 왜 이러한 연산자가 충돌 했습니까?
엔진은 벡터 3 클래스를 vector3 클래스가 아닌 엔진 네임 스페이스에있는 동등한 연산자와 함께 다른 vector3 클래스의 typedef로 정의합니다. 응용 프로그램 네임 스페이스에 동등 연산자가있는 클래스를 응용 프로그램에 추가했습니다.
컴파일을 시도했지만 적절하지 않은 벡터 비교가 적절한 동등 연산자를 찾을 수 없어 실패했습니다. 나는 갈등을 일으켜서 평등 연산자를 내가 추가 한 클래스로 옮겼다 고 생각하고 컴파일이 성공했다.
// 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++ 프로젝트에서이 버그를 재현하려고 시도했지만 중단되지 않습니다. 이 문제를 일으키는 커다란 코드베이스에 뭔가가 있어야하지만 어디서부터 시작해야할지 모르겠습니다. "엔진을 사용하는"불량배의 반대편과 같은 것이 있습니까? 누구든지 아이디어가있어?
그것은 VC2003, 그리고 Comeau에서 컴파일됩니다 ... – xtofl
사실 그것은 또한 내 예제를 너무 많이 단순화 한 것 같습니다. 내 typedef''d Vector3Impl 실제로 다른 네임 스페이스에서 : 네임 스페이스 Other {class Vector3Impl {}; } 테스트 파일에 해당 미묘를 추가하면 오류가 발생합니다. 해답은 동등 연산자를 엔진에서 기타로 이동하는 것입니다. – tenpn