سؤال

لقد حصلت على مجموعة عامة من الدرجة وأنا أحاول إضافة عامل المقارنة حتى أتمكن من اختبار ما إذا كان نطاق واحد يساوي آخر.أنه فشل في ترجمة و انا غير متأكد من كيفية إصلاح المشكلات انها تشكو.هل فاتني شيء واضح ؟ هنا مقتطف من التعليمات البرمجية:

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

...الذي يجمع بخير جانبا fromt انه المذكورة الأخطاء.إن تحويل كل قيمة Int32 فإنه يجمع ، ولكن في الحقيقة أود أن تبقى فئة عامة ممكن (أيلا havnig الزائد لكل نوع).أعتقد أنني يمكن أن فرعية لكل نوع والقيام طاقتها مشغلي هناك ، ولكن الحل هو أقل أنيق مما كان متوقعا عندما كنت الأولى اكتشف generics ;-)

هل كانت مفيدة؟

المحلول

لا يمكنك مقارنة القيم من نوع عام مع == المشغل لأن ليس كل أنواع قيمة مضمونة لتنفيذ ذلك.

على سبيل المثال, هذا نموذج التعليمات البرمجية فشل مع خطأ "المشغل '==' لا يمكن تطبيق المعاملات من نوع 'اختبار.MyStruct' و 'اختبار.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 قد المشغل==

ولكن من الواضح أن هذا ليس معيار 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() ;
}

بقدر ما أعرف ، يمكنك استخدام "المدى" بدلا من "مجموعة<T>"عندما T هو نفس النوع مثل نوع فئة القالب مثيل مع.تعطي هذه المحاولة.

خارج الموضوع, ولكن أود العودة const منطقي, وجعل ذلك وظيفة const أيضا.أيضا تغيير المحمية إلى القطاع الخاص إلا إذا كنت تعرف أنك بحاجة إلى الحماية.

وأنا أفترض أن '%' هو خطأ مطبعي من أجل '&'?تحرير:إلا أنني لاحظت فقط c++-cli الوسم لذلك من المحتمل مجنونة المشغل موجود في C++/CLI ، والتي للأسف لا أعرف شيئا عن :)

هل حاولت إضافة where IComparable القيد?

generic<typename T> where T: IComparable
public ref class Range  {
....
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top