【发布时间】:2011-11-18 00:56:22
【问题描述】:
当我尝试编译(使用 gcc 4.3.4)这段代码 sn-p:
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 em>,我没有编译错误。
由于这个问题我要更改很多旧代码(我正在将代码从旧版本的 HP-UX aCC 移植到 Linux 下的 g++ 4.3.4),我想更好地理解为了选择最好的方式修改代码。
提前感谢您的帮助。
【问题讨论】:
-
如果您删除转换为int,它对您有用吗?还是像其他人建议的那样从枚举到 int/char 的转换仍然模棱两可?
-
@K-ballo:如果我删除两个转换之一,它会起作用。如果我删除“void myFunc(char ch)”,它会起作用。如果我删除“void myFunc(int a)”,我会得到(几乎)同样的错误。
-
我坚持认为,上面的示例没有编译,而没有“void myFunc(char ch)”编译的示例,从常识的角度来看显然是错误的,当然,违反直觉。无论如何,从您的回答中,我知道这是(丑陋的)标准,我会尊重它(也因为我别无选择)。仅供参考,我决定将显式强制转换为 int 到我的生产代码中。感谢任何回答并因此帮助我更好地理解整个事情的人。
标签: c++ enums operators overloading ambiguous