考虑以下类:
class Foo
{
public:
void operator [] (const std::string& s) { }
void operator [] (std::size_t idx) { }
};
在这里,给定一个 的实例Foo f
,表达式f[0]
是没有歧义的,因为编译器选择了第二个重载。同样,表达式f["abc"]
也没有歧义,因为编译器选择了第一个重载(因为 aconst char*
可以转换为 an std::string
)。
那么,为什么如果我们有两个 Base 类,每个类都有不同的重载,那么为什么会突然出现歧义?
假设我们有:
class Base1
{
public:
void operator [] (const std::string& s) { }
};
class Base2
{
public:
void operator [] (std::size_t idx) { }
};
class Derived : public Base1, public Base2
{ };
现在,如果我们说:
Derived d;
d[0];
编译器抱怨:
error: request for member ‘operator[]’ is ambiguous
d[0];
^
note: candidates are: void Base2::operator[](std::size_t)
void operator [] (std::size_t idx) { }
^
note: void Base1::operator[](const string&)
void operator [] (const std::string& s) { }
为什么两个运算符重载现在都在基类中会导致任何歧义?有没有办法解决这个问题?
编辑:这可能是编译器错误(我使用的是 GCC 4.8.1)