视觉工作室 2013。
鉴于:
class base_1
{
public:
virtual void foo(int) = 0;
};
class base_2
{
public:
virtual void foo(int, double) = 0;
};
class join_1_2 : public virtual base_1, public virtual base_2
{};
我有一个水槽:
void sink(join_1_2 ¶m)
{
param.foo(42, 3.14);
}
但我得到以下编译器错误:
错误 C2385:“foo”的不明确访问
可能是基础“base_1”中的“foo”
或者可能是基础“base_2”中的“foo”
错误 C2660:“base_1::foo”:函数不接受 2 个参数
错误 C3861:“foo”:找不到标识符
我知道我可以通过以下方式解决此问题:
param.base_2::foo(42, 3.14);
但正如你可以想象的那样,虚拟继承已经是我不得不忍受的一种罪过。我可能会写一个适配器。但我不明白是什么阻止了编译器尝试解析 base_2 中的 foo。我的同事认为这是编译器错误,但我并没有这么快责怪供应商。
C++ 规范对跨基类解决重载虚方法有什么看法?