Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何比较C++;?_C++_Templates - Fatal编程技术网

C++ 如何比较C++;?

C++ 如何比较C++;?,c++,templates,C++,Templates,我需要确定一个元素是否与我通过引用传递的元素相同。 在函数所属中,我需要比较dis与存储在动态列表中的a元素之间的相等性: struct Nodo{ Dominio dominio; Rando rango; Nodo* next; }; typedef Nodo* ptrNodo; ptrNodo pri; template<class Dominio, class Rango> bool DicListas<Dominio,Rango>::Belongs(co

我需要确定一个元素是否与我通过引用传递的元素相同。 在函数
所属
中,我需要比较
d
is与存储在动态列表中的a元素之间的相等性:

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;
}
struct Nodo{Dominio Dominio;Rando rango;Nodo*next;};
typedef Nodo*ptrNodo;
ptrNodo-pri;
模板
布尔·迪克莉斯塔斯::归属(康斯特·多明尼奥与d)
{
bool-returno=false;
如果(!EsVacia())
{
ptrNodo aux=pri;
while(aux!=NULL)
{
if(aux->dominio==d)//-->这个类不知道如何比较dominio类型。
{
returno=aux->isDef;
}
aux=aux->sig;
}
}
返回号;
}
无论为类型参数
Dominio
提供什么类型参数,都必须为该类型重载
运算符==

假设你写下:

DicListas<A,B>  obj;
obj.Belongs(A());
还要注意,如果它是一个成员函数,那么它应该是
public
,最好将其设置为
const
函数,以便您可以比较
a
类型的const对象

您可以将
operator==
设置为非成员函数,而不是将其设置为成员函数:

bool operator == (const A &left, const A & right)
{
     //compare left and right.. and return true or false
}

我更喜欢后者。

它简化为为为用户定义的类型定义一个重载
操作符==

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

或者,作为
WhateverType

的成员,如果您想比较两种类型(可能不同)的,您可能需要查看使其成为TR1和C++11的类型特征的一个或多个版本(如果您使用的编译器支持TR1或C++11)

然而,这似乎不是你遇到的情况。在您的例子中,您知道这两个对象是同一类型的。在C++中,如果将一个类作为模板参数传递给模板,则不支持模板所需的所有方法或运算符。这就是你遇到的。这也是概念要解决的问题(好吧,概念是要宣传“如果你想在这个模板中使用你的类型,那么你的类型必须支持…”)。但是,不幸的是,我们在C++11中没有得到概念,因此需求是隐式的。在您的情况下,正如前面提到的,您只需要确保作为
Dominio
传递的任何类都支持
operator==


您可能还想了解一下,作为
Dominio
传入的任何类型都必须支持
operator=

您的
Nodo
类是什么样子,以及
bool Domino::operator==(const Domino&d)const
是否存在?您可能还应该添加一个
break
returno=aux->isDef之后这与模板有什么关系?如果该类没有比较,那么在不涉及泛型类型的情况下,如何确定两个实例是否相等;typedef Nodo*ptrNodo;ptrNodo-pri@MooingDuck:如果这是真的,那么返回aux->isDef将更好。实际上,使用retino的唯一原因是找到最后一个匹配的实例。好的,但是Dominio是一个结构体,我应该在那里做吗?还是在类中定义了归属函数?@sbi:Oh。。因为它不是常数函数?我刚刚编辑了它。还有什么吗?@HoNgOuRu:一个结构可以有一个类可以拥有的任何函数。值得一提的是,非成员函数是一个更灵活的构造,在这里您可以使用适用于lhs和rhs的常规类型转换规则。当然,成员操作符需要一个左手边作为类型a。(是的,我努力找到了一个位置来包含你在这个注释中:)。我将bool操作符==(const Dominio&d)放在结构Dominio中,它工作了,我必须告诉函数如果名称相同,则返回true,将this.name与d.name进行比较。谢谢
bool operator==(const WhateverType &a, const WhateverType &b)
{
    return whatever;
}