如何在C ++中比较两种泛型类型?

时间:2011-09-22 17:29:08

标签: c++ templates

我需要确定一个元素是否与我通过引用传递的元素相同。 在函数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;
}

3 个答案:

答案 0 :(得分:4)

无论您为类型参数 Dominio提供类型参数,您都要为该类型重载operator==

假设你写下这个:

DicListas<A,B>  obj;
obj.Belongs(A());

然后您要为类型operator==重载A

class A
{
 public:
    bool operator == (const A &a) const
    {
       //compare this and a.. and return true or false
    }
};

另请注意,如果它是成员函数,它应该是public,并且最好使它成为const函数,以便您可以比较{em> const 类型的对象{ {1}}。

您可以将A设为非成员函数,而不是使其成为成员函数:

operator==

我更喜欢后者。

答案 1 :(得分:2)

它减少为为用户定义的类型定义operator==的重载:

bool operator==(const WhateverType &a, const WhateverType &b)
{
    return whatever;
}

或者可能是WhateverType的成员。

答案 2 :(得分:1)

如果你想比较一些关于两个,可能是不同的类型,你可能想要查看Boost type traits或使其成为TR1和C +的类型特征的版本+11(如果您使用的是支持TR1或C ++ 11的编译器)。

然而,这似乎并不是你遇到的情况。在您的情况下,您知道这两个对象属于同一类型。在C ++中,如果作为类型参数传递给模板的类不支持模板所需的所有方法或运算符,则会出现编译器错误。这就是你遇到的。这也是概念要解决的问题(好吧,概念是为了宣传“如果你想在这个模板中使用你的类型,那么你的类型必须支持......”)。但是,遗憾的是我们没有在C ++ 11中获得概念,因此需求是隐含的。在您的情况下,如前所述,您只需要确保您在Dominio传递的任何课程都支持operator==

您可能还希望查看Boost concept check,宣传传递的任何类型,Dominio必须支持operator==