문제

일반 범위 클래스가 있고 비교 연산자를 추가하려고 노력하여 한 범위가 다른 범위와 동일인지 테스트 할 수 있습니다. 컴파일하지 못하고 불평하는 문제를 해결하는 방법을 잘 모르겠습니다. 내가 분명한 것을 놓쳤습니까? 코드의 스 니펫은 다음과 같습니다.

generic<typename T>
public ref class Range
{
protected:
    T m_min;
    T m_max;
public:

    ...
    ...

    bool operator==(Range<T>% rhs) 
    {
        return ( m_min == rhs.m_min ) && ( m_max == rhs.m_max );
    }
};

... 다음 오류로 컴파일하지 못합니다.

1>c:\projects\Utils.h(47) : error C2676: binary '==' : 'T' does not define this operator or a conversion to a type acceptable to the predefined operator

오버로드하려는 각 유형에 대한 변환을 정의해야합니까 (INT32 인스턴스화를 사용하고 있음)? 나는 제네릭을 사용하는 것을 방해하기 때문에 그런 종류의 것을 피하기를 바랐습니다.

편집하다 다음과 같이 인스턴스화가 있습니다.

Range<Int32> a = Range<Int32>(0,5);
Range<Int32> b = Range<Int32>(1,3);

if( Int32(2) != Int32(4) )
{
    printf("Int32 supports != operator");
}

if( a != b )
{
    printf("A != B : SUCCESS");
}
else
{
    printf("A == B : FAIL");
}

... 앞서 언급 한 오류를 제외하고는 괜찮습니다. 각 값을 INT32로 변환하면 컴파일하지만 실제로 클래스를 가능한 한 일반적인 상태로 유지하고 싶습니다 (즉, 각 유형에 대해 과부하가 걸리지 않습니다). 나는 각 유형에 대해 서브 클래스를 할 수 있고 과부하 된 연산자를 그곳에서 할 수 있다고 생각하지만 솔루션은 처음 발견했을 때 예상했던 것보다 덜 깔끔합니다. generics ;-)

도움이 되었습니까?

해결책

모든 값 유형을 구현하도록 보장되는 것은 아니기 때문에 일반 유형의 값을 == 연산자와 비교할 수 없습니다.

예를 들어,이 코드 샘플은 'Operator'== '오류가 발생하지 않으면'test.mystruct '및'test.mystruct '유형의 오페라에는 적용 할 수 없습니다.

struct MyStruct { }

class Tester {
    void Go()
    {
        bool b = new MyStruct() == new MyStruct();
    }
 }

다른 팁

표준 C ++에서는 쓸 것입니다

template< class T >
class Range {

    bool operator==(Range const & rhs) const {
        return ( m_min == rhs.m_min ) && ( m_max == rhs.m_max );
    }
};

그리고 Type T에 연산자가있는 한 작동합니다 ==

그러나 이것은 분명히 표준 C ++가 아닙니다. generic, public ref class,, Range<T>%

특별한 규칙을 찾으십시오 generic 상황, 나는 그들이 표준 템플릿보다 타입 T에 더 많은 제약 을가한다고 생각합니다.

VS2005에서 적어도 필요한 것은 다음과 같습니다.

generic<typename T> where T: IComparable, IEquatable<T>
public ref class Range {
    ...
};

이로 인해 컴파일러가 == 연산자를 수락합니다. 범위 클래스를 테스트하지는 않았지만 다음 클래스의 정적 메소드에서해야 할대로 작동합니다.

generic <class K, class V> where V: IComparable, IEquatable<V>
static
K
KeyForValue(Collections::Generic::IDictionary<K,V>^ src, V value) {
    for each (Collections::Generic::KeyValuePair<K,V>^ kvp in src) {
        if (kvp->Value==value) return kvp->Key ;
    }
    throw gcnew Collections::Generic::KeyNotFoundException() ;
    return K() ;
}

내가 아는 한, 당신은 "범위 대신"범위 "를 사용할 수 있습니다.u003CT> "t가 유형과 동일한 유형 일 때 클래스 템플릿이 인스턴스화됩니다. 시도해보십시오.

주제를 벗어나지 만 Const Bool을 반환하고 그 기능도 Const를 만듭니다. 또한 보호가 필요하다는 것을 알지 않는 한 개인으로 보호됩니다.

그리고 나는 '%'가 '&'의 오타라고 가정합니까? 편집 : 방금 C ++ -CLI 태그를 발견 한 것을 제외하고는 아마도 C ++/CLI에 존재하는 미친 연산자 일 것입니다. 슬프게도 나는 전혀 모릅니다 :)

추가 해 보셨습니까? where IComparable 강제?

generic<typename T> where T: IComparable
public ref class Range  {
....
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top