在 Visual Studio 2008 中,编译器无法解析对SetCustomer
in _tmain
下面并使其明确:
template <typename TConsumer>
struct Producer
{
void SetConsumer(TConsumer* consumer) { consumer_ = consumer; }
TConsumer* consumer_;
};
struct AppleConsumer
{
};
struct MeatConsumer
{
};
struct ShillyShallyProducer : public Producer<AppleConsumer>,
public Producer<MeatConsumer>
{
};
int _tmain(int argc, _TCHAR* argv[])
{
ShillyShallyProducer producer;
AppleConsumer consumer;
producer.SetConsumer(&consumer); // <--- Ambiguous call!!
return 0;
}
这是编译错误:
// error C2385: ambiguous access of 'SetConsumer'
// could be the 'SetConsumer' in base 'Producer<AppleConsumer>'
// or could be the 'SetConsumer' in base 'Producer<MeatConsumer>'
我认为模板参数查找机制足够聪明,可以推断出正确的基数Producer
。为什么不是呢?
我可以通过改变来解决这个问题Producer
to
template <typename TConsumer>
struct Producer
{
template <typename TConsumer2>
void SetConsumer(TConsumer2* consumer) { consumer_ = consumer; }
TConsumer* consumer_;
};
并打电话SetConsumer
as
producer.SetConsumer<AppleConsumer>(&consumer); // Unambiguous call!!
但如果我不必... 那就更好了
我认为模板参数查找机制足够聪明,可以推断出正确的基本生产者。
这与模板无关,它来自使用多个基类 - 名称查找已经不明确,并且重载解析仅在此之后发生。
一个简化的例子如下:
struct A { void f() {} };
struct B { void f(int) {} };
struct C : A, B {};
C c;
c.f(1); // ambiguous
解决方法是显式限定调用或将函数引入派生类范围:
struct ShillyShallyProducer : public Producer<AppleConsumer>,
public Producer<MeatConsumer>
{
using Producer<AppleConsumer>::SetConsumer;
using Producer<MeatConsumer >::SetConsumer;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)