Frage

Ich habe eine generische Bereich Klasse bekam und ich versuche, einen Vergleichsoperator hinzufügen, so kann ich testen, ob ein Bereich zum anderen gleich ist. Es schlägt fehl, zu kompilieren und ich bin nicht sicher, wie die Probleme zu beheben, es über beschwert. Habe ich etwas verpasst offensichtlich? Hier ist ein Ausschnitt des Codes:

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 );
    }
};

..., die mit dem folgenden Fehler kompilieren fehlschlägt:

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

Muss ich Conversions für jeden Typ definieren, die ich überlasten möchte (ich bin ein Int32 Instanziierung)? Ich habe gehofft, so etwas zu vermeiden, da es eher aus Verwendung von Generika schmälert.

[Bearbeiten] Ich habe eine Instanziierung bekam wie folgt:

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");
}

... was in Ordnung beiseite kompiliert fromt er Fehler oben erwähnt. Wenn ich jeden Wert in einen Int32 konvertieren kompiliert, aber wirklich würde Ich mag die Klasse so allgemein wie möglich halten (das heißt nicht havnig für jeden und jede Art zu überlasten). Ich glaube, ich könnte für jede Unterklasse und die überladenen Operatoren es tun, aber die Lösung ist weniger ordentlich, als ich erwartet hatte, als ich zum ersten Mal generics entdeckt; -)

War es hilfreich?

Lösung

Sie können keine Werte eines generischen Typs mit einem Operator == vergleichen, da nicht alle Werttypen zu ihrer Umsetzung gewährleistet.

Zum Beispiel versagt dieses Codebeispiel mit Fehlern „Operator‚==‘kann nicht auf Operanden vom Typ‚Test.MyStruct‘und‚Test.MyStruct‘angewandt werden.

struct MyStruct { }

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

Andere Tipps

In Standard-C ++ würden Sie schreiben

template< class T >
class Range {

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

und es würde funktionieren, solange der Typ T einen Operator hat ==

Das ist aber offensichtlich nicht Standard C ++, die generic, was der public ref class, die Range<T>%

Geben Sie für einige besondere Regeln für den generic Dinge, ich würde vermuten, sie mehr Constraints vom Typ T als eine Standardvorlage setzen.

In VS2005 zumindest, was nötig ist:

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

Dies führt zu den Compiler den Operator == akzeptieren. Ich habe nicht die Range-Klasse testen, aber es funktioniert, wie es sollte für die folgende statische Methode einer Klasse:

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() ;
}

Soweit ich weiß, können Sie „Range“ anstelle von „Range “ verwenden, wenn T ist die gleiche Art wie die Art der Klassenvorlage mit instanziiert. Gib, dass ein Versuch.

Off-topic, aber ich würde eine const bool zurückgeben, und diese Funktion const machen. Auch für private geschützt ändern, wenn Sie wissen, was Sie brauchen geschützt.

Und ich nehme an, dass ‚%‘ ist ein Tippfehler für ‚&‘? EDIT: Ich habe gerade bemerkt, außer der C ++ - cli-Tag, so dass wahrscheinlich einige verrückt Operator in C ++ / CLI, die leider ich weiß nichts über:)

Haben Sie versucht, eine where IComparable Einschränkung hinzufügen?

generic<typename T> where T: IComparable
public ref class Range  {
....
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top