编译i386架构代码时operator[]重载歧义错误求助
解决C++重载operator[]在i386架构下的歧义问题
先来看你的测试代码:
#include <stdio.h> #include <stdint.h> class test_class { public: test_class() {} ~test_class() {} const int32_t operator[](uint32_t index) const { return (int32_t)index; } operator const char *() const { return "Hello World"; } }; int main(void) { test_class tmp; printf("%d\n", tmp[3]); return 0; }
你遇到的use of overloaded operator '[]' is ambiguous错误,本质是编译器在解析tmp[3]时找到了两条合法的执行路径,且优先级相同,导致无法抉择:
- 路径1:把
3(int类型)隐式转换为uint32_t,调用你定义的test_class::operator[](uint32_t) - 路径2:通过你定义的
operator const char*(),把tmp隐式转换为const char*指针,然后使用C风格指针自带的数组下标运算符
在i386架构的编译环境下,这两种隐式转换的优先级一致,编译器没办法确定选哪一种,所以抛出了歧义错误。
可行的解决方案
这里提供几种不同思路的解决方法,你可以根据代码需求选择:
1. 显式指定调用逻辑
直接告诉编译器你要调用的是test_class的operator[],有两种实现方式:
- 显式调用成员函数:
printf("%d\n", tmp.operator[](static_cast<uint32_t>(3))); - 显式转换下标参数类型:
printf("%d\n", tmp[static_cast<uint32_t>(3)]);
2. 禁用const char*的隐式转换
如果你的operator const char*()不需要支持自动隐式转换,可以给它加上explicit关键字(C++11及以上标准支持),这样编译器就不会自动把test_class对象转成const char*,自然消除歧义:
explicit operator const char *() const { return "Hello World"; }
注意:加上explicit后,若需要转换为const char*,必须显式调用,比如static_cast<const char*>(tmp)。
3. 调整operator[]的参数类型
把operator[]的参数从uint32_t改成int或int32_t,这样3(int类型)就能直接匹配,不需要隐式转换,也就不会触发另一条转换路径:
const int32_t operator[](int index) const { return static_cast<int32_t>(index); }
如果需要保留无符号类型的逻辑,可以在函数内部先判断输入合法性,再转换为uint32_t处理。
内容的提问来源于stack exchange,提问作者NinetyPercent
相关产品推荐
相关产品推荐

