现象:
今天在练习封装xml重写 [ ] 操作符后,调用时出现error: ambiguous overload for ‘operator[]’ (operand types are ‘CXmlNode’ and ‘int’)。
函数原型:
class CXmlNode
{
...
CXmlNode& operator[](const char* nodename)
{
....
}
CXmlNode& operator[](uint32_t idx)
{
...
}
...
}
main.cpp:
xmlReader["system"]["logs"][0].Name();
原因:
查资料解释说是在调用时,参数有string 和 int 识别不出来。
个人测试总结原因为:传递的参数为number时,默认被识别为int,不会自动转换为无符号整型等,所以导致报错。
解决:
网上提供的解决办法是在调用的时候参数为int时在后面加u。这个方法可以解决,但是每次调用都要去注意这个感觉不方便,而且如果形参类型如果为long、unsigned long、 unsigned long long 则应该对应加 l、ul、ull。例如:
//举个栗子
CXmlNode& operator[](unsigned int idx);
xmlReader["system"]["logs"][0u].Name();
CXmlNode& operator[](long idx);
xmlReader["system"]["logs"][0l].Name();
CXmlNode& operator[](unsigned long idx);
xmlReader["system"]["logs"][0ul].Name();
个人解决方案:因为我的使用场景不会有超过int最大值(2147483647)的情况,所以直接将形参改为整型:
CXmlNode& operator[](int idx);
问题记录只为自己少踩几个坑,以及给遇到同样问题的提供一个思路,如有不对请大佬评论指出,以便及时更正不误导他人。