gpt4 book ai didi

C++ 转换运算符重载、枚举、整数和字符

转载 作者:可可西里 更新时间:2023-11-01 18:28:45 26 4
gpt4 key购买 nike

当我尝试编译(使用 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());
}

我收到这个错误:

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)

我想我(几乎)明白了问题所在,即(大大简化了它)即使我谈到“char”和“enum”,它们都是整数,然后重载是模棱两可的。

无论如何,我不太明白的是,如果我删除 myFunc 的第二个重载 OR MyClass ,我没有编译错误。

由于这个问题我要更改很多旧代码(我正在将代码从旧版本的 HP-UX aCC 移植到 Linux 下的 g++ 4.3.4),我想更好地理解整个事情是为了选择修改代码的最佳方式。

提前感谢您的帮助。

最佳答案

MyClass 的转换是不明确的,因为有一个到 int 的转换和一个到枚举的转换,它本身可以隐式转换为 int,两者都是同样好的转换。不过,您可以通过指定所需的转换来显式调用:

myfunc(int(MyClass()));

或者,您可能想重新考虑为什么您有一个函数对 intchar 有单独的重载,或许也可以重新设计。

关于C++ 转换运算符重载、枚举、整数和字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7433995/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com