这段程序在gcc2.95.3下编译成功,但是在vc6下报错。class integer
{
private:
  int value;
public:
  operator int&()
  {
    return value;
  }
};int main()
{
  integer x;
  int y = x; // ok, even under vc.net
  y = x; // error C2593: 'operator =' is ambiguous
}我不明白的是两个y=x中一个正确,另一个有错。
如果把operator int&()改为operator int()那么就可以编译通过。
这一切如何解释呢?vc为什么认为'operator ='是有歧义的呢?

解决方案 »

  1.   

    在main()函数里,把第三句改成
    y = (int)x;
      

  2.   

    这是编程器的问题,在gcc中它自动给你强制转换了,在VC中,要自己强制转换
    y = (int)x;
      

  3.   

    那为什么 int y = x; 可以不要加类型转换呢?
    或者说为什么
    int y = x; 编译器不报错,而写成
    int y;
    y = x; 编译器就报错呢?
      

  4.   

    隐式转换:int y = x显示转换:y=(int)x
      

  5.   

    这两个=的含义是不一样的, y=x是operator=(), int y=x是调用构造函数
    vc的实现可能对此有区别.
      

  6.   

    刚查过, 对于int说构造函数可能不太合适. 
    不过initialization和assignment确实是不同的概念, 例如可以对const int的变量作initialization, 但不可以assignment.
    这里, 我感觉VC在隐式类型转换方面有些问题. 似乎在initialization时接受const int&, 但是assignment的时候接受const int和const int&
      

  7.   

    我并没说initialization和assignment是相同的概念,对于const int类型的变量来说他们确实是不同的,即使是对于int类型的变量来说,initialization和assignment也是不同的概念。但是,在我举的例子中,这两个应该都会做隐式的类型转换。微软的人呢??
      

  8.   

    我帮你把这个问题发到microsoft.public.vc.language新闻组去了, 那里会有ms的人吧
      

  9.   

    这里很少看到MS的人出没的, 我只看到过一次 :)
    社区技术支持应该不是MS的工作吧, 否则要MVP干什么 ;-)新闻组里由一个叫James Curran/MVP的人的回答, 和我想的差不多, 给你参考一下    As far as I can see, ints effectively define operator=(int) and
    operator=(const int&).  An int& can be converted into either one, so the
    compiler can't choose. Defining it as   operator const int&()  { return value; }or   operator int()  { return value; }solves the problem.--
    Truth,
    James Curran
    www.NovelTheory.com  (Personal)
    www.NJTheater.com   (Professional)
    www.aurora-inc.com   (Day job)
      

  10.   

    又到comp.lang.c++问过了, 结果基本上倾向于是VC的bug
    代码本身应该是合法的C++, vc对于built-in operator=实现大概有问题.
    VC.NET报告的错误信息也令人费解, 似乎问题是出在等号的左边
    error C2593: 'operator =' is ambiguous
            could be 'built-in C++ operator=(int, int)'
            or       'built-in C++ operator=(int &, int)'
            while trying to match the argument list '(int, integer)'你可以考虑给比尔写信报告这个问题:-)解决方法我想你也知道, 应该分为两个函数实现
    class integer
    {
    public:
      operator const int& () { return value; }
      operator = (int i) { value = i; }
    private:
      int value;
    };
    一般情况下, 把成员变量直接暴露给客户修改不是好的C++设计, 那样还不如定义成public.
      

  11.   

    vc的bug真是多,学习c++还没几天就发现了三四个bug!
      

  12.   

    第一个int y = x:
    编译器解释为int y(x) -> int y(x.operator int());第二个y = x:
    编译器解释为 y.operator=(x);
    而y没有定义operator=运算符,所以提示 'operator =' is ambiguous