歧义而重载转型操作(Ambiguity while overloading the cast ope

2019-09-26 14:21发布

考虑下面的示例代码:

#include <iostream>

using namespace std;

class dummy
{
   private:
      int y;

   public:
      dummy(int b = 0) : y(b) {
      }

      friend ostream& operator<<(ostream& os, const dummy& obj);
};

ostream& operator<<(ostream& os, const dummy& obj)
{
   os << obj.y;
   return os;
}

class sample
{
   private:
      int x;

   public:
      sample(int a = 0) : x(a)
      {
      }

      operator dummy()
      {
         dummy d(100);
         return d;
      }

      operator int()
      {
         return x;
      }
};

int main()
{
   sample ob1(5);
   dummy d;

   //d = ob1; //Line1  
   d = (dummy)ob1; //Line2

   cout << d << "\n";
}

在1号线,隐式转换完成。 据我所知,隐式转换在这种情况下如何工作的。 编译器没有给出错误。

但是,在2号线的显式的转换sample对象做是为了dummy对象。 但是,编译器提供了以下错误。

错误:重载`虚设的呼叫(样品)”不明确

注意:考生有:虚设::假人(常量哑)

注意:虚拟::假人(INT)

问题:

  1. 为什么发生这些错误?

  2. 我不明白的错误消息的含义。 为什么候选功能dummy类中的错误提到?

Answer 1:

该行:

d = (dummy)ob1

试图做到以下几点:

  1. 构造一个dummy从对象obj1
  2. 分配一个临时的dummy对象d

第一部分是什么原因造成的问题。 为了构建临时dummy对象,编译器必须寻找一些方法来转换obj1到其中的一个类型的dummy可以从构成。 报告认为,有两种方法可以做到这一点:

  1. 电话operator int
  2. 电话operator dummy

你不告诉它这两个选择中的一个,你希望它取,所以代码是不明确的。


你的问题可能被重新创建(删除无关的部分)如下:

struct t_1 {};
struct t_2 {};
struct sample {
    operator t_1() const{ return t_1(); }
    operator t_2() const{ return t_2(); }
};
void f(t_1) {}
void f(t_2) {}
int main() {
    sample obj1;
    //overload resolution will fail
    //disambiguate with f(obj1.operator t_1()) or f(obj1.operator t_2())
    f(obj1);
}


文章来源: Ambiguity while overloading the cast operator