【发布时间】:2013-10-17 01:27:02
【问题描述】:
考虑以下类:
class Foo
{
public:
void operator [] (const std::string& s) { }
void operator [] (std::size_t idx) { }
};
这里,给定一个Foo f 的实例,表达式f[0] 是没有歧义的,因为编译器选择了第二个重载。同样,表达式f["abc"] 也没有歧义,因为编译器选择了第一个重载(因为const char* 可以转换为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)
【问题讨论】:
-
Visual C++ 2010 不会抱怨。你用的是哪个编译器?
-
你可能想看看this question。
-
我似乎记得读过一些关于向 C++ 添加显式
null类型以解决这个确切问题的内容... -
@DaoWen:我相信您正在考虑
nullptr以及int和指针(尤其是char const*)之间的重载解析,但那不是一回事。 -
@Channel72:也许在辩论结束之前不要将答案标记为“已接受”?
标签: c++