C++ “我怎么能?”;“双重过载”;接线员?

C++ “我怎么能?”;“双重过载”;接线员?,c++,operator-overloading,C++,Operator Overloading,如果我有一个类似数据库的类,我想做如下事情: class B {}; class C {}; class A { bool operator==(const B& b) { //Put logic here return true; } bool operator==(const C& c) { //Put logic here return true; } }; 对象[1]==其他对象 如何“双重重载

如果我有一个类似数据库的类,我想做如下事情:

class B {};
class C {};
class A
{
  bool operator==(const B& b)
  {
      //Put logic here
      return true;
  }

  bool operator==(const C& c)
  {
      //Put logic here
      return true;
  }

};
对象[1]==其他对象


如何“双重重载”运算符[]和运算符==?

对象[1]
返回
某种类型的对象。您需要在该
类型上重载
运算符==

您描述的只是两个单独的运算符重载。只需确保
operator==
的参数与
operator[]
的返回类型相匹配,不要认为运算符重载有什么特殊之处,它们就像正常的函数重载一样。如果具有不同签名,则可以重载具有相同名称的两个函数。(顺便说一句,不能仅通过返回类型重载2个函数。这不仅适用于运算符重载,通常也适用于所有函数重载。)

简单地说:

class B {};
class C {};
class A
{
  bool operator==(const B& b)
  {
      //Put logic here
      return true;
  }

  bool operator==(const C& c)
  {
      //Put logic here
      return true;
  }

};

上面的代码将允许您将
A
类型的对象与
B
类型的对象进行比较。它还允许您将
A
类型的对象与
C
类型的对象进行比较。起初,我对问题的措辞感到困惑,但现在我想我明白了。你不能直接这么做;但是你可以达到同样的效果。其思想是让
操作符[]
返回一个代理对象。对于代理对象,您可以为
操作符==
提供用于比较的自定义行为。我见过std::map的操作符[]以这种方式在一些更老、更模糊的标准库实现中实现

示例(假设对象[1]通常返回Foo&):

注意:在这种情况下,您希望重载比较运算符的含义似乎有点奇怪(代理对象通常用于具有关联结构的自定义赋值行为或奇特的元模板编程),但对于比较,它们通常应提供与直接使用
Foo
相同的含义,例如,尽管如此,这里还是有一种方法:通过
运算符==
获得自定义行为的方法,该方法仅适用于在同一表达式中使用重载的
运算符[]


如果您想彻底解决这个问题,那么就让SomeProxy的构造函数私有化,并让数据库成为朋友。这样,只有数据库:可以创建这些对象(在本例中通过操作符[]),而客户端将无法复制(他不应该复制),只能从中获取一个Foo对象/引用,或者使用表达式中返回的代理。

只需单独重载它们,编译器就会处理它。问题是什么?好的,但我得到了这个错误:“…\Database.cpp:36:错误:在数据库::operator[](unsigned int)const(x)=inRecord')中的“operator==”不匹配”如果你发布一个带有一些相关代码的新问题,可能更容易理解:)inRecord
的类型和
operator[]的返回值是什么常数
?您是否将
operator==
作为非常量方法重载了
operator[]
的返回值?