【发布时间】:2011-03-22 14:42:37
【问题描述】:
class messageA {
};
class messageB {
};
template<class T>
class queue {
public:
virtual ~queue() {}
void submit(T& x) {}
};
class A : public queue<messageA>, public queue<messageB>
{
};
int main()
{
A aa;
aa.submit(messageA());
aa.submit(messageB());
}
我的第一个想法是,上面的代码应该没问题,因为 A 类将包含 2 个重载的提交函数,它们将接受 messageA 和 messageB 对象。
但是,编译器给了我以下错误:
我可以知道为什么会有歧义吗?对于第一次提交调用,我想调用 messageA 版本不是很明显吗?对于第二次提交调用,我想调用 messageB 版本?
------ Build started: Project: main, Configuration: Release Win32 ------
Compiling...
main.cpp
.\main.cpp(21) : error C2385: ambiguous access of 'submit'
could be the 'submit' in base 'queue<messageA>'
or could be the 'submit' in base 'queue<messageB>'
.\main.cpp(21) : error C3861: 'submit': identifier not found
.\main.cpp(22) : error C2385: ambiguous access of 'submit'
could be the 'submit' in base 'queue<messageA>'
or could be the 'submit' in base 'queue<messageB>'
.\main.cpp(22) : error C2664: 'queue<T>::submit' : cannot convert parameter 1 from 'messageB' to 'messageA &'
with
[
T=messageA
]
.\main.cpp(22) : error C3861: 'submit': identifier not found
【问题讨论】:
-
请注意,从
messageA到messageA&的隐式转换不是标准C++;非常量引用只能绑定到左值 (msdn.microsoft.com/en-us/library/186yxbac(VS.80).aspx)。submit()函数应该接受const T&而不是T&。
标签: c++ multiple-inheritance ambiguous name-lookup class-members