【发布时间】:2010-11-09 03:14:50
【问题描述】:
$7.3.3/14 (C++03)
struct A { int x(); };
struct B : A { };
struct C : A {
using A::x;
int x(int);
};
struct D : B, C {
using C::x;
int x(double);
};
int f(D* d) {
return d->x(); // ambiguous: B::x or C::x
}
'f' 中代码中的注释表明可以预期 'B::x' 或 'C::x' 之间存在歧义。
但是,在使用 g++(ideone) 或 Comeau 编译时,错误略有不同。这些错误不是表示 B::x 或 C::x 中的歧义,而是表明 A 是 D 的歧义基这一事实
prog.cpp:在函数“int f(D*)”中: prog.cpp:16:错误:“A”是 ‘D’的模棱两可的基础
还有
“ComeauTest.c”,第 21 行:错误:base “A”类不明确 返回 d->x(); // 模棱两可:B::x 或 C::x
按照 $10.2 中的名称查找规则,我觉得代码 sn-p 中的注释并不真正正确。该错误确实首先与基类“A”的歧义有关,而不是其他任何事情(例如重载决议中的歧义)。有什么想法吗?
【问题讨论】:
-
有趣的是,Visual C++ 10.0编译了上面的,选择B中的A子对象...如果它选择C中的A子对象我可以理解它。似乎g ++和Comeau首先解析了成员函数作为 A::x(),然后他们发现 d->A::x() 是模棱两可的。但是,有趣的是,Visual C++ 10.0 甚至可以编译!
-
@Alf P. Steinbach:是的。我也很惊讶
-
由于我没有C++03编译器,希望大家能容忍这个问题... struct D中virtual关键字的使用怎么样:virtual B, C or struct D:虚拟C,虚拟B?
标签: c++ ambiguity overload-resolution name-lookup