일반 유형의 경우 연산자를 만들 수 없습니까?
-
22-07-2019 - |
문제
일반 범위 클래스가 있고 비교 연산자를 추가하려고 노력하여 한 범위가 다른 범위와 동일인지 테스트 할 수 있습니다. 컴파일하지 못하고 불평하는 문제를 해결하는 방법을 잘 모르겠습니다. 내가 분명한 것을 놓쳤습니까? 코드의 스 니펫은 다음과 같습니다.
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로 변환하면 컴파일하지만 실제로 클래스를 가능한 한 일반적인 상태로 유지하고 싶습니다 (즉, 각 유형에 대해 과부하가 걸리지 않습니다). 나는 각 유형에 대해 서브 클래스를 할 수 있고 과부하 된 연산자를 그곳에서 할 수 있다고 생각하지만 솔루션은 처음 발견했을 때 예상했던 것보다 덜 깔끔합니다. generic
s ;-)
해결책
모든 값 유형을 구현하도록 보장되는 것은 아니기 때문에 일반 유형의 값을 == 연산자와 비교할 수 없습니다.
예를 들어,이 코드 샘플은 '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 {
....