문제

엔진과 응용 프로그램의 두 가지 주요 네임 스페이스가 포함 된 큰 빅 코드베이스가 있습니다.

엔진은 Vector3 클래스를 다른 vector3 클래스의 전형으로 정의하며, vector3 클래스가 아닌 엔진 네임 스페이스에있는 평등 연산자가 있습니다. 응용 프로그램 네임 스페이스에 평등 연산자가있는 응용 프로그램에 클래스를 추가했습니다.

컴파일을 시도했을 때, 관련이 없지만 거의 벡터 3 비교는 적절한 평등 연산자를 찾을 수 없기 때문에 실패했습니다. 나는 충돌을 일으키고 있다고 의심해서 평등 연산자를 내가 추가 한 수업으로 옮겼고 컴파일이 성공했습니다.

// 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
    }
}

그러나 그것에 대해 생각한 후에는 왜 컴파일이 실패했는지 알 수 없습니다. Vector3에서 내 클래스 또는 그 반대로 암시적인 변환은 없으며, 인수 의존적 조회는 엔진 네임 스페이스에서 평등 연산자를 끌어 내고 일치시켜야합니다.

샘플 C ++ 프로젝트 에서이 버그를 재생하려고 시도했지만 이는 깨지기를 거부합니다. 큰 빅 코드베이스에는이 문제를 일으키는 무언가가 있어야하지만 어디에서 찾아보기 시작 해야하는지 잘 모르겠습니다. "엔진을 사용하는"도적의 반대와 같은 것? 누구든지 아이디어가 있습니까?

도움이 되었습니까?

해결책

C ++ 표준, 3.4.4.2 선언 :

함수 호출의 각 인수 유형 T에 대해, 0 이상의 관련 네임 스페이스 세트와 고려할 0 개 이상의 관련 클래스 세트가 있습니다. 네임 스페이스 및 클래스 세트는 전적으로 함수 인수의 유형 (및 템플릿 템플릿 인수의 네임 스페이스)에 의해 결정됩니다. 유형을 지정하는 데 사용되는 TypEdef 이름 및 사용 설명서를 사용 하여이 세트에 기여하지 않습니다..

ADL은 TypEdef와 함께 작동하지 않습니다.

다른 팁

한 번은 인수 의존적 조회 (Koenig Lookup- 감사합니다 @igor) (vc6 생각)가없는 컴파일러와 동일한 문제를 일으켰습니다. 이것은 연산자를 볼 때 네임 스페이스를 둘러싸고 있음을 의미합니다.

그렇다면 어떤 컴파일러를 사용하는지 알려주시겠습니까?

다른 컴파일러로 이동하면 해결되었습니다.

참으로 매우 불편합니다.

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

클래스에 정의 된 평등 연산자의 표준 정의에는 하나의 인수, 즉 RHS가 있어야합니다. LHS는 이것입니다. 그래도 이것이 당신의 문제에 대한 해결책인지 모르겠습니다.

이것이 제가 쓸 것입니다.

클래스 vector3 {bool 연산자 == (const vector3 & rhs) const {...}};

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top