質問

一般的な範囲クラスがあり、ある範囲が別の範囲と等しいかどうかをテストできるように比較演算子を追加しようとしています。コンパイルに失敗し、文句を言っている問題を修正する方法がわかりません。明らかな何かを見逃していませんか?コードのスニペットは次のとおりです。

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を発見したときに予想したよりもすっきりしていません;-)

役に立ちましたか?

解決

すべての値型で実装が保証されているわけではないため、==演算子を使用してジェネリック型の値を比較することはできません。

たとえば、このコードサンプルはエラーで失敗します<!> quot;演算子 '=='は、タイプ '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 );
    }
};

そして、タイプTにoperator ==

があれば機能します

ただし、これは明らかに標準C ++ではなく、genericpublic ref classRange<T>%

<=>事柄に関する特別なルールを探してください。標準テンプレートよりもタイプTにより多くの制約を課していると思います。

少なくともVS2005では、必要なものは次のとおりです。

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

これにより、コンパイラは==演算子を受け入れます。 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() ;
}

私の知る限り、<!> quot; Range <!> quot;を使用できます。代わりに<!> quot; Range <!> lt; T <!> gt; <!> quot; Tが、クラステンプレートがインスタンス化される型と同じ型である場合。試してみてください。

トピック外ですが、const boolを返し、その関数もconstにします。また、保護が必要であることがわかっていない限り、protectedをprivateに変更します。

そして、「%」は「<!> amp;」のタイプミスだと思いますか?編集:c ++-cliタグに気付いたので、C ++ / CLIにはおそらくクレイジーな演算子がありますが、残念ながら私は何も知りません:)

where IComparable制約を追加しようとしましたか?

generic<typename T> where T: IComparable
public ref class Range  {
....
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top