3

我有这些代码:

class Type2 {
public:
  Type2(const Type1 & type);
  Type2(int);
const Type2 & operator=(const Type2 & type2);
//....
};

...
  Type1 t1(13);
  Type2 t2(4);

  t2=t1;

据我了解,每个没有显式关键字的 Type2 的 1 参数构造函数应该意味着任何 Type1 对象或 int 值都可以隐式转换为 Type2 对象。

但在最后一行t2=t1; ,MS Visual Studio 给了我这个编译错误:

....错误 C2679:二进制“=”:未找到采用“Type1”类型右侧操作数的运算符(或没有可接受的转换)....

似乎 MS Visual Studio 坚持t2=t1; 必须匹配具有 lhs=Type2 和 rhs=Type1 的赋值运算符。为什么不能将 rhs 隐式转换为 t2 然后使用 Type2=Type2 运算符进行复制?

4

2 回答 2

2

我找到了答案。因为我的 Type1 有一个转换运算符

    class Type1 {
    public:
        Type1 (int );
        operator  Type2() ;//casting to Type2

    ....
    };

这就是所谓的“双向隐式转换”

于 2011-06-19T08:21:22.030 回答
1

这段代码:

#include <iostream>

using ::std::cerr;

class Barney;

class Fred {
 public:
   Fred() { }
   Fred(const Barney &b) { cerr << "Using conversion constructor.\n"; }
};

class Barney {
 public:
   Barney() { }
   operator Fred() const { cerr << "Using conversion operator.\n"; return Fred(); }
};

int main(int argc, const char *argv[])
{
   const Barney b;
   Fred f;
   f = b;
   return 0;
}

在 gcc 4.6 中生成此错误:

g++ -O3 -Wall fred.cpp -o a.out
fred.cpp: In function ‘int main(int, const char**)’:
fred.cpp:23:8: error: conversion from ‘const Barney’ to ‘const Fred’ is ambiguous
fred.cpp:21:17: note: candidates are:
fred.cpp:16:4: note: Barney::operator Fred() const
fred.cpp:10:4: note: Fred::Fred(const Barney&)
fred.cpp:7:7: error:   initializing argument 1 of ‘Fred& Fred::operator=(const Fred&)’

Compilation exited abnormally with code 1 at Sun Jun 19 04:13:53

现在,如果我删除constafter operator Fred(),它就会编译并使用转换构造函数。如果我还从 in 的声明中删除了,const那么它更喜欢转换运算符。bmain

这一切都符合重载决议规则。当 gcc 无法在转换运算符和转换构造函数之间进行选择时,它会生成适当的歧义错误。

我注意到在您提供的示例中,转换运算符缺少const. 这意味着永远不会出现使用转换运算符或转换构造函数不明确的情况。

于 2011-06-19T11:17:24.087 回答