2008-10-17 9 views
1

저는 엔진과 응용 프로그램의 두 가지 주요 네임 스페이스를 포함하는 커다란 코드 기반을 확보했습니다.함수 오버로드가 실패합니다. 왜 이러한 연산자가 충돌 했습니까?

엔진은 벡터 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++ 프로젝트에서이 버그를 재현하려고 시도했지만 중단되지 않습니다. 이 문제를 일으키는 커다란 코드베이스에 뭔가가 있어야하지만 어디서부터 시작해야할지 모르겠습니다. "엔진을 사용하는"불량배의 반대편과 같은 것이 있습니까? 누구든지 아이디어가있어?

답변

2

C++ 표준은 3.4.4.2는 선언

함수 호출에서 각 인자 타입 T 용

이되도록 제로 세트 이상의 관련 네임 스페이스 제로 세트 이상의 관련 클래스가 깊이 생각한. 네임 스페이스 및 클래스 집합은 함수 인수 (및 템플릿 템플릿 인수의 네임 스페이스) 유형 인 에 의해 완전히 결정됩니다. 형식을 지정하는 데 사용 된 형식 정의 이름 및 사용 선언 은이 집합에 기여하지 않습니다.

ADL은 typedef에서 작동하지 않습니다.

+0

그것은 VC2003, 그리고 Comeau에서 컴파일됩니다 ... – xtofl

+0

사실 그것은 또한 내 예제를 너무 많이 단순화 한 것 같습니다. 내 typedef''d Vector3Impl 실제로 다른 네임 스페이스에서 : 네임 스페이스 Other {class Vector3Impl {}; } 테스트 파일에 해당 미묘를 추가하면 오류가 발생합니다. 해답은 동등 연산자를 엔진에서 기타로 이동하는 것입니다. – tenpn

-1
bool operator==(Vector3 const &lhs, Vector3 const &rhs) { ... } 

클래스에 정의 된 항등 연산자의 표준 정의에는 하나의 인수, 즉 rhs 만 있어야합니다. lhs가 이것입니다. 이것이 문제의 해결책이 될지 모르겠다.

내가 쓸 것 인 것이다 :

클래스 Vector3 { 부울 연산자 == (const를 Vector3 & 우) const를 {...} 을};

+0

tenpn은 클래스 외부에 정의 된 연산자를 사용하여 초기 코드를 둘러싸는 네임 스페이스에 기록했다고 생각합니다. – xtofl

+0

두 개의 인수를 취하는 독립 실행 형 연산자를 작성하는 데는 아무런 문제가 없습니다.첫 번째 인수가 원할 경우 암시 적 변환을 허용하는 이점이 있습니다. – Gorpik

+0

"평등 연산자의 표준 정의"는 코딩 할 위치에 따라 달라집니다. 클래스 내부에서 말이 맞습니다. 밖에, "tenpn"맞아, 나는 그의 표기법을 선호한다 : Meyers와 Sutter는 캡슐화를위한 멤버 함수보다 나은 비회원 비 친구 함수를 논의했다. – paercebal

0

나는 한 번 인자 종속적 인 조회 (Koenig Lookup - thanks @igor)가없는 컴파일러에서 같은 문제가 발생했습니다 (VC6 생각). 이것은 연산자를 볼 때, 둘러싼 네임 스페이스를 검색한다는 것을 의미합니다.

그래서 어떤 컴파일러를 사용하는지 말해 줄 수 있습니까?

다른 컴파일러로 이동하면 해결됩니다.

실제로 매우 불편합니다.