[英]How do I compare two generic types in C++?
我需要确定一个元素是否与我通过引用传递的元素相同。 在函数Belongs
我需要比较d
is和动态列表中存储的元素之间的相等性:
struct Nodo{ Dominio dominio; Rando rango; Nodo* next; };
typedef Nodo* ptrNodo;
ptrNodo pri;
template<class Dominio, class Rango>
bool DicListas<Dominio,Rango>::Belongs(const Dominio &d)
{
bool retorno = false;
if(!EsVacia())
{
ptrNodo aux=pri;
while(aux!=NULL)
{
if(aux->dominio==d)//-------> THIS CLASS DOESN'T KNOW HOW TO COMPARE THE TYPE DOMINIO.
{
retorno = aux->isDef;
}
aux = aux->sig;
}
}
return retorno;
}
无论您为类型参数 Dominio
提供什么类型的参数, Dominio
为该类型重载operator==
。
假设,你写这个:
DicListas<A,B> obj;
obj.Belongs(A());
然后你要为类型A
重载operator==
:
class A
{
public:
bool operator == (const A &a) const
{
//compare this and a.. and return true or false
}
};
另请注意,如果它是成员函数,它应该是public
的,并且最好使它成为const
函数,以便您可以比较类型A
const对象。
您可以使operator==
成为非成员函数,而不是使其成为成员函数:
bool operator == (const A &left, const A & right)
{
//compare left and right.. and return true or false
}
我更喜欢后者。
它减少了为用户定义的类型定义operator==
的重载:
bool operator==(const WhateverType &a, const WhateverType &b)
{
return whatever;
}
或者作为WhateverType
的成员。
如果你想比较约两 ,可能是不同的,类型的东西,你可能想看看在任升压型特质 ,如果你正在使用的编译器支持或类型的特征,使得它成为TR1的版本和C ++ 11( TR1或C ++ 11)。
但是,这似乎不是你遇到的情况。 在您的情况下,您知道这两个对象属于同一类型。 在C ++中,如果作为类型参数传递给模板的类不支持模板所需的所有方法或运算符,则会出现编译器错误。 这就是你遇到的。 这也是概念要解决的问题(好吧,概念是为了宣传“如果你想在这个模板中使用你的类型,那么你的类型必须支持......”)。 但是,遗憾的是我们没有在C ++ 11中获得概念,因此需求是隐含的。 在您的情况下,如前所述,您只需要确保您传入的任何类作为Dominio
支持operator==
。
您可能还想查看Boost概念检查,以宣传传入的任何类型,因为Dominio
必须支持operator==
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.