我有一个通用的范围类,我尝试添加一个比较操作符,所以我可以测试一个范围是否等于另一个。它不能编译,我不知道如何解决它抱怨的问题。我错过了一些东西明显?下面的代码的一个片段:

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少整齐; - )

有帮助吗?

解决方案

可以不因为不是所有的值类型,保证实现其与==操作符比较的通用类型的值。

例如,此代码示例失败,错误“操作员‘==’不能被应用于类型‘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具有操作者,将工作==

但是,这显然是不标准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是同类型的类模板实例与类型。给一个尝试。

题外话,但我会返回一个常量布尔,使该功能常量了。同时更改保护私人除非你知道你需要保护的。

和我假定“%”为“&”一个错字?编辑:除了我刚才注意到了C ++ - CLI标签,所以这可能是一些运营商目前在C ++ / CLI,可惜这种情况我一无所知疯狂:)

您是否尝试过加入where IComparable约束?

generic<typename T> where T: IComparable
public ref class Range  {
....
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top