繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM