Possible Duplicate:
Why do multiple-inherited functions with same name but different signatures not get treated as overloaded functions?暧昧访问
我得到一个错误:
ambiguous access of 'attach'
could be the 'attach' in base 'A::A1'
or could be the 'attach' in base 'B::B1'
这是代码:
class A
{
public:
class A1
{
public:
virtual void attach(A & a) { }
};
public:
};
class B
{
public:
class B1
{
public:
virtual void attach(B & b) { }
};
public:
};
class C : public A::A1, public B::B1
{
public:
C(){ }
};
void main(int argc, char *argv[])
{
A a;
B b;
C c;
c.attach(a);
c.attach(b);
}
我理解错误。编译器是混乱的,就是了范围:
c.A::A1::attach(a);
c.B::B1::attach(b);
这句法是可怕的。我可以定义在c安装方法,以及现在编译器得到它,但我不希望有定义所有这些连接方法:
class C : public A::A1, public B::B1
{
public:
C(){ }
void attach(A & a) { A::A1::attach(a); }
void attach(B & b) { B::B1::attach(b); }
};
谁能向我解释为什么编译器当我清楚地意识到应该使用哪种“附加”的时候,对“附加”感到困惑?任何人都可以提供一个不需要范围界定的解决方案吗?
UPDATE:更新了我的第二个C示例中的范围,例如, A::A1::attach(a)
UPDATE:在调查重复下面指出的那样,我在整个解决方案来:
class C : public A::A1, public B::B1
{
public:
using A::A1::attach;
using B::B1::attach;
public:
C(){ }
};
在我这18年的C++程序员,我从来没有使用“使用”这样的。我甚至不知道存在。
@Xeo:我不认为这是重复的 - 他想知道*为什么*。 – Puppy
@DeadMG:恩......我的问题标题中的第一个单词是什么? – Xeo
@Xeo是对的。它是重复的。答案就在那里。我更新了问题以包含(相当令人惊讶的)解决方案。 – Blazes