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个重载的submit函数,它们将接受messageA和messageB对象。
然而,编译器给我以下错误:
我能知道为什么会出现歧义吗?难道不很明显吗,对于第一个submit调用,我想调用messageA版本?对于第二个submit调用,我想调用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++;非 const 引用只能绑定到左值 (http://msdn.microsoft.com/en-us/library/186yxbac(VS.80).aspx)。`submit()` 函数应该接受const T&
而不是T&
。 - In silico