c ++转换运算符重载,枚举,整数和字符

por*_*ing 7 c++ enums overloading operators ambiguous

当我尝试编译(使用gcc 4.3.4)时,这段代码片段:

enum SimpleEnum {
    ONEVALUE
};

void myFunc(int a) {
}

void myFunc(char ch) {
}

struct MyClass {
    operator int() const { return 0; };
    operator SimpleEnum() const { return ONEVALUE; };
};

int main(int argc, char* argv[]) {
    myFunc(MyClass());
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

test.cc: In function "int main(int, char**)":
test.cc:17: error: call of overloaded "myFunc(MyClass)" is ambiguous
test.cc:5: note: candidates are: void myFunc(int)
test.cc:8: note:                 void myFunc(char)
Run Code Online (Sandbox Code Playgroud)

我想我(差不多)明白问题是什么,即(简化它很多),即使我说的是"char"和"enum",它们都是整数,然后重载是模棱两可的.

无论如何,我真的不明白的是,如果我删除myFunc 的第二次重载MyClass的一个转换操作符,我没有编译错误.

由于这个问题我将要更改大量旧代码(我将代码从旧版本的HP-UX aCC移植到Linux下的g ++ 4.3.4),我想更好地理解整个问题.为了选择修改代码的最佳方法.

预先感谢您的任何帮助.

Ant*_*rez 4

enum与 C 不同,s 是 C++ 中的类型。

enum->charenum->都有隐式转换int。编译器只是不知道选择哪一个。


编辑:尝试不同的测试后:

  • MyClass当自定义转换->的定义int被删除时,代码将进行编译。

  • 这里存在 enum 到 的隐式转换int,因此它是编译器比 to 更喜欢的转换char在这里测试一下

  • 当删除 的定义时,void myFunc(int)编译失败。

  • 编译器尝试从 转换MyClasschar,发现没有用户定义的转换运算符char(),用户定义的int()和都SimpleEnum()可以使用。在这里测试一下

  • 当您添加char()转换运算符进行MyClass编译时,会失败并出现与未添加相同的错误。

  • 在这里测试一下

因此,我在这里得出的结论是,在您最初发布的代码中,编译器必须决定myFunc应该调用两个重载版本中的哪一个。由于这两种转换都是可能的:

  1. MyClass通过int用户定义的转换运算符。
  2. MyClasstoint通过用户定义的转换 ( MyClassto SimpleEnum) + 隐式转换 ( SimpleEnumtochar )

编译器不知道该使用哪一个。